【问题标题】:using dirPath Provider with WebDeploy将 dirPath Provider 与 WebDeploy 一起使用
【发布时间】:2012-10-11 22:54:38
【问题描述】:

我有一个托管在 iis 中的 wcf 应用程序,我正在尝试使用 webdeploy 进行打包。一切都适用于 Visual Studio 工具,但我还需要创建一个日志文件夹并设置权限。为此,我在我的 Web 项目中创建了一个 ProjectName.wpp.target 文件。 文件是这样的

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<Target Name="CreateLogsDirectory" AfterTargets="AddIisSettingAndFileContentsToSourceManifest">   
    <!-- This must be declared inside of a target because the property 
    $(_MSDeployDirPath_FullPath) will not be defined at that time. -->
    <ItemGroup>
      <MsDeploySourceManifest Include="dirPath">
        <Path>$(_MSDeployDirPath_FullPath)\logs</Path>
        <enableRule>DoNotDeleteRule</enableRule>
      </MsDeploySourceManifest>
    </ItemGroup>
  </Target>

  <Target Name="DeclareCustomParameters" AfterTargets="AddIisAndContentDeclareParametersItems">
    <!-- This must be declared inside of a target because the property 
    $(_EscapeRegEx_MSDeployDirPath) will not be defined at that time. -->
    <ItemGroup>
      <MsDeployDeclareParameters Include="LogsDirectoryPath">
        <Kind>ProviderPath</Kind>
        <Scope>dirPath</Scope>
        <Match>^$(_EscapeRegEx_MSDeployDirPath)\\logs$</Match>
        <Value>$(_DestinationContentPath)/log</Value>
        <ExcludeFromSetParameter>True</ExcludeFromSetParameter>
      </MsDeployDeclareParameters>
    </ItemGroup>
  </Target>
</Project>

我可以看到 dirPath 提供程序已添加到 sourcemanifest 文件中,但是当我部署包时,它会尝试创建源文件路径。本质上,LogsDirectoryPAth 项目并没有替换路径。有人可以指出我需要做什么吗?谢谢!

【问题讨论】:

    标签: msbuild msdeploy webdeploy


    【解决方案1】:

    考虑到您的附加目录位于您的 Web 应用程序中,实际上没有必要包含另一个 dirPath 提供程序,这样做只会导致更多麻烦(附加参数声明等)。

    这里有一些我用来帮助处理这类事情的助手。您的应用程序特定值可以在您的 wpp.targets 文件中声明:

    <!-- Items specific to your application (these should be in your wpp.targets) -->
    <ItemGroup>
      <SkipDeleteFiles Include="logs" />
    
      <EmptyDirectoriesToDeploy Include="logs" />
    
      <AdditionalAcls Include="logs">
        <AclAccess>Write</AclAccess>
      </AdditionalAcls>
    </ItemGroup>
    

    以下基于约定的定义可以放在wpp.targets 中,也可以放在可以导入wpp.targets 的通用目标文件中:

    <!-- 
      Empty directories
    -->
    
    <PropertyGroup>
      <BeforeAddContentPathToSourceManifest>
        $(BeforeAddContentPathToSourceManifest);
        CreateEmptyDirectories;
      </BeforeAddContentPathToSourceManifest>
    </PropertyGroup>
    
    <Target Name="CreateEmptyDirectories">
      <MakeDir Directories="$(_MSDeployDirPath_FullPath)\%(EmptyDirectoriesToDeploy.Identity)" 
               Condition="'@(EmptyDirectoriesToDeploy)' != ''" />
    </Target>
    
    <!-- 
      Additional ACLs 
    -->
    
    <ItemDefinitionGroup>
      <AdditionalAcls>
        <AclAccess>Write</AclAccess>
        <ResourceType>Directory</ResourceType>
      </AdditionalAcls>
    </ItemDefinitionGroup>
    
    <PropertyGroup>
      <AfterAddIisSettingAndFileContentsToSourceManifest>
        $(AfterAddIisSettingAndFileContentsToSourceManifest);
        AddAdditionalAclsToSourceManifest;
      </AfterAddIisSettingAndFileContentsToSourceManifest>
      <AfterAddIisAndContentDeclareParametersItems>
        $(AfterAddIisAndContentDeclareParametersItems);
        AddAdditionalAclsDeclareParameterItems
      </AfterAddIisAndContentDeclareParametersItems>
    </PropertyGroup>
    
    <Target Name="AddAdditionalAclsToSourceManifest">
      <ItemGroup Condition="'@(AdditionalAcls)' != ''">
        <MsDeploySourceManifest Include="setAcl">
          <Path>$(_MSDeployDirPath_FullPath)\%(AdditionalAcls.Identity)</Path>
          <setAclResourceType Condition="'%(AdditionalAcls.ResourceType)' != ''">%(AdditionalAcls.ResourceType)</setAclResourceType>
          <setAclAccess>%(AdditionalAcls.AclAccess)</setAclAccess>
          <AdditionalProviderSettings>setAclResourceType;setAclAccess</AdditionalProviderSettings>
        </MsDeploySourceManifest>
      </ItemGroup>
    </Target>
    
    <Target Name="AddAdditionalAclsDeclareParameterItems">
      <ItemGroup Condition="'@(AdditionalAcls)' != ''">
        <MsDeployDeclareParameters Include="Add %(AdditionalAcls.AclAccess) permission to %(AdditionalAcls.Identity) Folder">
          <Kind>ProviderPath</Kind>
          <Scope>setAcl</Scope>
          <Match>^$(_EscapeRegEx_MSDeployDirPath)\\@(AdditionalAcls)$</Match>
          <Description>Add %(AdditionalAcls.AclAccess) permission to %(AdditionalAcls.Identity) Folder</Description>
          <DefaultValue>{$(_MsDeployParameterNameForContentPath)}/@(AdditionalAcls)</DefaultValue>
          <DestinationContentPath>$(_DestinationContentPath)/@(AdditionalAcls)</DestinationContentPath>
          <Tags>Hidden</Tags>
          <ExcludeFromSetParameter>True</ExcludeFromSetParameter>
          <Priority>$(VsSetAclPriority)</Priority>
        </MsDeployDeclareParameters>
      </ItemGroup>
    </Target>
    
    <!-- 
      Skip delete files and directories
    -->
    
    <PropertyGroup>
      <ImportPublishingParameterValuesDependsOn>
        $(ImportPublishingParameterValuesDependsOn);
        AddSkipDirectives;
      </ImportPublishingParameterValuesDependsOn>
    </PropertyGroup>
    
    <ItemGroup>
      <SkipDeleteItems Include="@(SkipDeleteFiles)" 
                       Condition="'@(SkipDeleteFiles)' != ''">
        <Provider>filePath</Provider>
      </SkipDeleteItems>
    
      <SkipDeleteItems Include="@(SkipDeleteDirectories)" 
                       Condition="'@(SkipDeleteDirectories)' != ''">
        <Provider>dirPath</Provider>
      </SkipDeleteItems>
    </ItemGroup>
    
    <!-- Uses MSBuild trickery to add an escaped version of the skip path to as 
         "EscapedPath" metadata -->
    <Target Name="AddRegexEscapedPathMetadata" Outputs="%(SkipDeleteItems.EscapedPath)">
      <EscapeTextForRegularExpressions Text="%(SkipDeleteItems.Identity)">
        <Output TaskParameter="Result" 
                PropertyName="_Temp_EscapeRegEx_SkipDeleteItemPath" />
      </EscapeTextForRegularExpressions>
    
      <ItemGroup>
        <SkipDeleteItems Condition="'%(SkipDeleteItems.Identity)' == '%(Identity)'" >
          <EscapedPath>$(_Temp_EscapeRegEx_SkipDeleteItemPath)</EscapedPath>
        </SkipDeleteItems>
      </ItemGroup>
    
      <PropertyGroup>
        <!-- Clear value -->
        <_Temp_EscapeRegEx_SkipDeleteItemPath></_Temp_EscapeRegEx_SkipDeleteItemPath>
      </PropertyGroup>
    
    </Target>
    
    <Target Name="AddSkipDirectives" DependsOnTargets="AddRegexEscapedPathMetadata">
    
      <ItemGroup>
        <MsDeploySkipRules Include="%(SkipDeleteItems.Identity)">
          <SkipAction>Delete</SkipAction>
          <ObjectName>%(SkipDeleteItems.Provider)</ObjectName>
          <AbsolutePath>%(SkipDeleteItems.EscapedPath)</AbsolutePath>
        </MsDeploySkipRules>
      </ItemGroup>
    
    </Target>
    

    注意如果您付出额外的努力将打包过程与部署过程分开,那么从技术上讲,您的 SkipDeleteFiles 应该在您的 pubxml 中,而不是您的 wpp.targets 中。 p>

    【讨论】:

    • 我非常感谢您所做的所有工作;我的大部分 wpp 知识来自您的帖子。我发现这篇文章是因为我实际上是在尝试使用无法位于站点根目录中的 dirPath 同步文件,但我无法弄清楚如何在 MSBuild 中表达它。假设地说,如果这个答案不能更好地解决 OP 的问题,他怎么能使用 dirPath?我希望调整解决方案以解决源和目标 dirPath 必须不同以支持构建代理隔离(即没有共享绝对路径)的情况
    • @bwerks - 很高兴能提供帮助!如果您将此作为一个单独的问题提出,我会在有机会时看看。
    • @RichardSzalay 感谢您为这项研究所做的出色工作。虽然它不适用于带有斜线的路径。所以,我必须将空白文件添加到我的目录并稍微更改代码:&lt;ItemGroup&gt; &lt;Content Include="Dir\SubDir\_blank.txt" /&gt; &lt;SkipDeleteItems Include="Dir\SubDir"&gt; &lt;Provider&gt;filePath&lt;/Provider&gt; &lt;/SkipDeleteItems&gt; &lt;EmptyDirectoriesToDeploy Include="Dir\SubDir" /&gt; &lt;AdditionalAcls Include="Dir\SubDir" /&gt; &lt;/ItemGroup&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多