использование провайдера dirPath с WebDeploy

У меня есть приложение wcf, размещенное в iis, которое я пытаюсь упаковать с помощью webdeploy. Все отлично работает с инструментами Visual Studio, но мне нужно также создать папку журналов и установить разрешения для нее. Для этого я создал файл ProjectName.wpp.target в своем веб-проекте. Файл выглядит так



   
    
    
      
        $(_MSDeployDirPath_FullPath)\logs
        DoNotDeleteRule
      
    
  

  
    
    
      
        ProviderPath
        dirPath
        ^$(_EscapeRegEx_MSDeployDirPath)\\logs$
        $(_DestinationContentPath)/log
        True
      
    
  

я вижу, что провайдер dirPath добавляется в файл sourcemanifest, но при развертывании пакета он пытается создать путь к исходному файлу. По сути, элемент LogsDirectoryPAth не заменяет путь. Кто-то может указать, что мне нужно сделать? Спасибо !

Ответы на вопрос(1)

Решение Вопроса

что ваш дополнительный каталог находится внутри вашего веб-приложения, он 'не обязательно включать другой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>
</emptydirectoriestodeploy></skipdeletefiles></itemgroup>

И следующие условные определения могут быть введены в васwpp.targets или в общем файле целей, который можно импортировать в:wpp.targets

<!-- 
  Empty directories
-->

<propertygroup>
  <beforeaddcontentpathtosourcemanifest>
    $(BeforeAddContentPathToSourceManifest);
    CreateEmptyDirectories;
  </beforeaddcontentpathtosourcemanifest>
</propertygroup>

<target name="CreateEmptyDirectories">
  <makedir directories="$(_MSDeployDirPath_FullPath)\%(EmptyDirectoriesToDeploy.Identity)" condition="'@(EmptyDirectoriesToDeploy)' != ''">
</makedir></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)
<!-- 
  Empty directories
-->

<propertygroup>
  <beforeaddcontentpathtosourcemanifest>
    $(BeforeAddContentPathToSourceManifest);
    CreateEmptyDirectories;
  </beforeaddcontentpathtosourcemanifest>
</propertygroup>

<target name="CreateEmptyDirectories">
  <makedir directories="$(_MSDeployDirPath_FullPath)\%(EmptyDirectoriesToDeploy.Identity)" condition="'@(EmptyDirectoriesToDeploy)' != ''">
</makedir></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">
  </output></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>
lt;/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"> </output></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

 Richard Szalay19 мар. 2015 г., 07:17
@bwerks - рад, что помог! Если вы зададите это как отдельный вопрос, яЯ посмотрю, когда у меня будет шанс.
 Pavel Korsukov19 окт. 2015 г., 11:04
@RichardSzalay Спасибо за отличную работу, которую вы проделали с этим исследованием. Хотя это не сработало для пути с косой чертой. Итак, я должен добавить пустой файл в свой каталог и немного изменить код: filePath
 bwerks19 мар. 2015 г., 02:03
Я очень благодарен за всю работу, которую вы делаете; большая часть моих знаний о wpp исходит из ваших сообщений. Я нашел этот пост, потому что я на самом деле пытаюсь синхронизировать файлы, используя dirPath, который не может находиться в корне сайта, но яМне трудно понять, как это выразить в MSBuild. Гипотетически говоря, если OP 'вопрос не быллучше ответить на этот ответ, как он мог использовать dirPath? Я надеюсь адаптировать решение для решения ситуаций, когда исходный и целевой каталог dirPath должны различаться для поддержки изоляции агента сборки (т. Е. Нет общих абсолютных путей)

Ваш ответ на вопрос