Given that your secondary directory is inside your web application, it is not necessary to include another dirPath provider, and this will only lead to more headaches (additional parameter declarations, etc.).
Here are some helpers I use to help with this. Your specific application values ββcan be declared in your wpp.targets file:
<ItemGroup> <SkipDeleteFiles Include="logs" /> <EmptyDirectoriesToDeploy Include="logs" /> <AdditionalAcls Include="logs"> <AclAccess>Write</AclAccess> </AdditionalAcls> </ItemGroup>
And the following conventions-based definitions can either be placed in you wpp.targets , or in a general goals file that you can import into your wpp.targets :
<PropertyGroup> <BeforeAddContentPathToSourceManifest> $(BeforeAddContentPathToSourceManifest); CreateEmptyDirectories; </BeforeAddContentPathToSourceManifest> </PropertyGroup> <Target Name="CreateEmptyDirectories"> <MakeDir Directories="$(_MSDeployDirPath_FullPath)\%(EmptyDirectoriesToDeploy.Identity)" Condition="'@(EmptyDirectoriesToDeploy)' != ''" /> </Target> <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> <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> <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> <_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 make an extra effort to separate the packaging process from the deployment process, then technically your SkipDeleteFiles should be in your pubxml and not in your wpp.targets .
source share