using dirPath Provider with WebDeploy

a 夏天 提交于 2019-12-05 07:21:59

问题


I have a wcf application hosted in iis that i am trying to package using webdeploy. Everything works great with the visual studio tools, but i need to also create a logs folder and set permissions on it. For this i created a ProjectName.wpp.target file in my web project. The file looks like this

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

i can see that dirPath provider is added to the sourcemanifest file, but when i deploy the package it tries to create the source file path. Essentially the LogsDirectoryPAth item is not replacing the path. can someone point out what i need to do ? thanks !


回答1:


Considering your additional directory is inside your web application, it's not really necessary to include another dirPath provider and doing so would only lead to more headaches (additional parameter declarations, etc).

Here are some helpers I use to help with this kind of thing. Your application specific values can be declared in your wpp.targets file:

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

And the following convention-based definitions can be either put in you wpp.targets or in a common targets file that can be imported into your 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 If you go to the extra effort to separate your packaging process from your deployment process, then technically your SkipDeleteFiles should be in your pubxml rather than your wpp.targets.



来源:https://stackoverflow.com/questions/12849812/using-dirpath-provider-with-webdeploy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!