使用dirPath提供商与WebDeploy(using dirPath Provider with

2019-08-01 09:50发布

我在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项目不更换路径。 能有人指出我需要做什么? 谢谢 !

Answer 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>

NB如果你去了额外的努力,你的包装过程从部署过程中分离出来,然后在技术上你SkipDeleteFiles应该是你pubxml而不是你wpp.targets



文章来源: using dirPath Provider with WebDeploy