MSDeploy пропускает правила при использовании MSBuild PublishProfile с Visual Studio 2012

Я пытаюсь использовать WebDeploy для публикации веб-сайта с использованием настраиваемых правил пропуска MSDeploy и профиля публикации, сохраненного в Visual Studio 2012.

У меня профиль публикации работает из командной строки, но правило пропуска для пропуска удаления папки не работает.

У меня есть подпапка ErrorLog в моем веб-приложении с файлом web.config внутри, чтобы установить правильные разрешения для папки. Без каких-либо правил пропуска папка ErrorLog и файл web.config публикуются нормально, но все существующие файлы журнала ошибок в папке на сервере удаляются при публикации.


Ошибка с <SkipAction>Delete</SkipAction>

Когда я добавляю настраиваемое правило пропуска в свой wpp.targets файл, правило пропуска больше не принимает значение для элемента <SkipAction>. Если я установил <SkipAction>Delete</SkipAction>, я получаю следующую ошибку:

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.targets(4377,5): error : Web deployment task failed. (Unrecognized skip directive 'skipaction'. Must be one of the following: "objectName," "keyAttribute," "absolutePath," "xPath," "attributes.<name>.") [C:\inetpub\wwwroot\My.Website\My.Website\My.Website.csproj]

Если я просто опущу элемент <SkipAction>, папка ErrorLog будет удалена, когда она обычно публикуется.

Если я устанавливаю <SkipAction></SkipAction>, папка ErrorLog удаляется при публикации.

Если выставить <KeyAttribute>Delete</KeyAttribute>, то ErrorLog и файл web.config публикуются нормально.

Насколько я понимаю, для использования настраиваемых правил пропуска вам необходимо вызвать MSBuild из командной строки вместо публикации из VS 2012. Я все же хотел бы использовать свои сохраненные профили публикации, и я понимаю, что теперь это возможно, поскольку VS 2012.


Моя командная строка MSBuild:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe My.Website.sln /p:Configuration=Release;DeployOnBuild=true;PublishProfile="Test Server - Web Deploy"

My.Website.wpp.targets:

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest>
  </PropertyGroup>

  <Target Name="AddCustomSkipRules">
    <Message Text="Adding Custom Skip Rules" />
    <ItemGroup>
      <MsDeploySkipRules Include="SkipErrorLogFolder1">
        <SkipAction></SkipAction>
        <KeyAttribute>Delete</KeyAttribute>
        <ObjectName>dirPath</ObjectName>
        <AbsolutePath>$(_Escaped_WPPAllFilesInSingleFolder)\\ErrorLog$</AbsolutePath>
        <XPath></XPath>
      </MsDeploySkipRules>
    </ItemGroup>
  </Target>
</Project>

Мои выходные данные MSBuild, показывающие настраиваемое правило пропуска, но все еще удаляющие файлы:

GenerateMsdeployManifestFiles:
  Generate source manifest file for Web Deploy package/publish ...
AddCustomSkipRules:
  Adding Custom Skip Rules
MSDeployPublish:
  Start Web Deploy Publish the Application/package to http://testserver.domain.com/MSDEPLOYAGENTSERVICE ...
  Starting Web deployment task from source: manifest(C:\inetpub\wwwroot\My.Website\My.Website\obj\Release\Package\My.Website.SourceManifest.xml) to Destination: auto().
  Deleting filePath (MyWeb/ErrorLog\test.txt).
  Updating setAcl (MyWeb/).
  Updating setAcl (MyWeb/).
  Updating filePath (MyWeb/ErrorLog\Web.config).
  Updating filePath (MyWeb/Web.config).
  Updating setAcl (MyWeb/).
  Updating setAcl (MyWeb/).
  Successfully executed Web deployment task.
  Publish is successfully deployed.

person nekno    schedule 25.09.2012    source источник


Ответы (7)


Изменить: Оказывается, вы правы: директива skip игнорируется при выполнении из Visual Studio.

К счастью, есть обходной путь.

Что вы хотите:

<!-- Skip the deletion of any file within the ErrorLog directory -->
<MsDeploySkipRules Include="SkipErrorLogFolder1">
  <SkipAction>Delete</SkipAction>
  <ObjectName>filePath</ObjectName>
  <AbsolutePath>ErrorLog</AbsolutePath>
</MsDeploySkipRules>

Кроме того, вам нужно запретить VS использовать UI-задачу (которая, по-видимому, содержит ошибку, касающуюся правил пропуска). Вы можете сделать это, объявив следующее в своих wpp.targets или pubxml:

<PropertyGroup>
  <UseMsDeployExe>true</UseMsDeployExe>
</PropertyGroup>

Я протестировал это локально и могу подтвердить, что он работает должным образом: дополнительный файл обновляется, но файлы в каталоге не удаляются.

person Richard Szalay    schedule 25.09.2012
comment
Если я использую правило пропуска, как вы показываете, без значения SkipAction и элемента KeyAttribute, оно пропускает удаление файлов в папке ErrorLog --- так что это хорошо --- но оно также пропускает публикацию файла ErrorLog\web.config --- плохо . Почему я не могу использовать <SkipAction>Delete</SkipAction>, как показывают все примеры в Интернете (включая вашу ссылку на Technet)? Кстати, у меня сложилось впечатление, что правила пропуска работают только при сборке с MSBuild.exe из (A) тестирования ранее в VS 2010 и (B) это сообщение в блоге - person nekno; 25.09.2012
comment
Можно указать SkipAction. - person Richard Szalay; 26.09.2012
comment
Нет, это не так. Если вы укажете <SkipAction>Delete</SkipAction>, в моем вводном вопросе появится ошибка. И если вы укажете <SkipAction></SkipAction> с пустым элементом, ErrorLog\web.config не будет опубликовано. - person nekno; 26.09.2012
comment
@nekno - я не уверен насчет ошибки, но я обнаружил обходной путь для игнорирования правила пропуска. Смотрите мой обновленный ответ. - person Richard Szalay; 26.09.2012
comment
Спасибо, это прекрасно работает - я пробовал всевозможные комбинации UseMsDeployExe с разными значениями SkipAction, ObjectName и AbsolutePath, но мне не удалось найти именно ту комбинацию, которую вы опубликовали. Несмотря на попытки имитировать другие правила с использованием регулярных выражений в собственных файлах Microsoft .targets, похоже, что он не работает ни с одним регулярным выражением в значении AbsolutePath. Только ErrorLog точно работает. Тем не менее, это работает для моего сценария. - person nekno; 27.09.2012
comment
@RichardSzalay У меня есть проект, который я постоянно публикую на веб-сайте Azure. В проекте у меня есть папка под названием media, в которой файлы загружаются через контент-менеджер. Каждый раз, когда я публикую свой проект, эта папка удаляется. У меня есть правило пропустить удаление этой папки, используя синтаксис из вашего ответа. Что я делаю не так? - person amhed; 01.03.2013
comment
@amhed Добро пожаловать в StackOverflow. Мы стараемся не задавать дополнительные вопросы в комментариях. Вы должны задать новый вопрос, я (а не кто-то другой) смогу помочь. - person Richard Szalay; 01.03.2013
comment
Думаю, у меня та же проблема, что и у @amhed, которую я задал здесь stackoverflow.com/questions/18226048/ Ричард, может, вы можете показать свой полный пример или загрузить где-нибудь zip-файл решения? Я пробовал все, но не смог заставить ваш пример работать - person David Smit; 14.08.2013
comment
Это ответ, который я искал ... через 1 час мне удалось его найти. Слава Богу и @RichardSzalay! : D Я даже написал скромное сообщение в блоге с простым примером об этом здесь: leniel.net/2014/05/ - person Leniel Maccaferri; 22.05.2014

Для справки, вот мой полный .wpp.targets файл с рабочим правилом пропуска для пропуска удаления папки ErrorLog и настраиваемых ACL, чтобы сделать папку ErrorLog доступной для записи на сервере.

Начиная с VS 2012 Update 3, это работает только при публикации с помощью MSBuild из командной строки с параметрами DeployOnBuild=true;PublishProfile="Test Server - Web Deploy", переданными в MSBuild. Это не будет работать при публикации из VS.

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <UseMsdeployExe>true</UseMsdeployExe> <!-- Required for the MSDeploySkipRules to work -->
    <DeployManagedPipelineMode>Integrated</DeployManagedPipelineMode>
  </PropertyGroup>

  <PropertyGroup>
    <AfterAddIisSettingAndFileContentsToSourceManifest>
      $(AfterAddIisSettingAndFileContentsToSourceManifest);
      AddCustomSkipRules;
    </AfterAddIisSettingAndFileContentsToSourceManifest>
  </PropertyGroup>

  <Target Name="AddCustomSkipRules">
    <Message Text="Adding Custom Skip Rules" />
    <ItemGroup>
      <MsDeploySkipRules Include="SkipErrorLogFolder">
        <SkipAction>Delete</SkipAction>
        <ObjectName>filePath</ObjectName>
        <AbsolutePath>ErrorLog</AbsolutePath>
        <XPath></XPath>
      </MsDeploySkipRules>
    </ItemGroup>
  </Target>

  <PropertyGroup>
    <AfterAddIisSettingAndFileContentsToSourceManifest>
      $(AfterAddIisSettingAndFileContentsToSourceManifest);
      SetCustomACLs;
    </AfterAddIisSettingAndFileContentsToSourceManifest>
    <AfterAddDeclareParametersItemsForContentPath>
      $(AfterAddDeclareParametersItemsForContentPath);
      SetCustomAclParameters;
    </AfterAddDeclareParametersItemsForContentPath>
  </PropertyGroup>

  <Target Name="SetCustomACLs">
    <Message Text="Setting Custom ACLs" />
    <ItemGroup>
      <!--Make sure the application pool identity has write permission to the download folder--> 
      <MsDeploySourceManifest Include="setAcl"
        Condition="$(IncludeSetAclProviderOnDestination) And Exists('$(_MSDeployDirPath_FullPath)\ErrorLog')">
        <Path>$(_MSDeployDirPath_FullPath)\ErrorLog</Path>
        <setAclAccess>Write</setAclAccess>
        <setAclResourceType>Directory</setAclResourceType>
        <AdditionalProviderSettings>setAclResourceType;setAclAccess</AdditionalProviderSettings>
      </MsDeploySourceManifest>
    </ItemGroup>
  </Target>

  <Target Name="SetCustomAclParameters">
    <Message Text="Setting Custom ACL Parameters" />
    <EscapeTextForRegularExpressions Text="$(_MSDeployDirPath_FullPath)">
      <Output TaskParameter="Result" PropertyName="_EscapeRegEx_MSDeployDirPath" />
    </EscapeTextForRegularExpressions>
    <ItemGroup>
      <MsDeployDeclareParameters Include="Add write permission to ErrorLog folder"
        Condition="$(IncludeSetAclProviderOnDestination) and Exists('$(_MSDeployDirPath_FullPath)\ErrorLog')">
        <Kind>ProviderPath</Kind>
        <Scope>setAcl</Scope>
        <Match>^$(_EscapeRegEx_MSDeployDirPath)\\ErrorLog$</Match>
        <Description>Add write permission to ErrorLog folder</Description>
        <DefaultValue>Default Web Site/ErrorLog</DefaultValue>
        <Value>$(DeployIisAppPath)/ErrorLog</Value>
        <Tags>Hidden</Tags>
        <Priority>$(VsSetAclPriority)</Priority>
        <ExcludeFromSetParameter>True</ExcludeFromSetParameter>
      </MsDeployDeclareParameters>
    </ItemGroup>
  </Target>
</Project>
person nekno    schedule 24.09.2013
comment
Целый файл целей неоценим. Спасибо! - person bwerks; 27.03.2014

Другой подход - избежать тега SkipAction, я успешно использовал эту настройку непосредственно из VS 2013:

<Target Name="AddCustomSkipRules"
        AfterTargets="AddIisSettingAndFileContentsToSourceManifest">
    <Message Text="Adding Custom Skip Rules" />
    <ItemGroup>
        <MsDeploySkipRules Include="SkipMedia">
            <objectName>dirPath</objectName>
            <absolutePath>media</absolutePath>
        </MsDeploySkipRules>
        <MsDeploySkipRules Include="SkipUpload">
            <objectName>dirPath</objectName>
            <absolutePath>upload</absolutePath>
        </MsDeploySkipRules>
    </ItemGroup>
</Target>

Единственное предостережение, насколько я могу судить, заключается в том, что он игнорирует операции обновления, удаления и добавления.

person Hauge    schedule 26.02.2016
comment
это пропустит любой путь, включая ключевые слова загрузки и мультимедиа, а не только папки загрузки / мультимедиа. - person alaasdk; 05.06.2016

После многих часов поиска в сети. Я создал этот файл как {myprojectname} .wpp.targets в корневой папке сайта. он работает при публикации в Visual Studio. медиа-папка игнорируется. Я использую VS 2010.

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <UseMsdeployExe>true</UseMsdeployExe>
        <!-- Required for the MSDeploySkipRules to work -->
        <DeployManagedPipelineMode>Integrated</DeployManagedPipelineMode>
    </PropertyGroup>

    <PropertyGroup>
        <AfterAddIisSettingAndFileContentsToSourceManifest>
            $(AfterAddIisSettingAndFileContentsToSourceManifest);
            AddCustomSkipRules;
        </AfterAddIisSettingAndFileContentsToSourceManifest>
    </PropertyGroup>

    <Target Name="AddCustomSkipRules">
        <Message Text="Adding Custom Skip Rules - WPP Targets 2" />
        <ItemGroup>
            <MsDeploySkipRules Include="SkipErrorLogFolder">
                <SkipAction>Delete</SkipAction>
                <ObjectName>dirPath</ObjectName>
                <AbsolutePath>media</AbsolutePath>
                <XPath></XPath>
                <Apply>Destination</Apply>
            </MsDeploySkipRules>
        </ItemGroup>
    </Target>
</Project>
person Sanjay    schedule 25.08.2014

Думаю, проблема в неправильном AbsolutePath. Это должно быть регулярное выражение, соответствующее файлу или папке. так что его следует как следует избежать. Ниже приведен пример, который у меня сработал (я хотел пропустить удаление app_offline.htm, чтобы сделать доставку частью более крупного развертывания)

<PropertyGroup>
    <PackageUsingManifestDependsOn>$(PackageUsingManifestDependsOn);AddCustomSkipRules</PackageUsingManifestDependsOn>
  </PropertyGroup>
  <Target Name="AddCustomSkipRules">
    <ItemGroup>
      <MsDeploySkipRules Include="SkipAppOfflineOnDeploy">
        <SkipAction></SkipAction>
        <ObjectName>filePath</ObjectName>
        <AbsolutePath>app_offline\.htm</AbsolutePath>
        <Apply>Destination</Apply>
        <XPath></XPath>
      </MsDeploySkipRules>
    </ItemGroup>
  </Target>
person Koman    schedule 21.11.2013
comment
Нет, из моего вопроса вы увидите, что я использовал экранированный путь регулярного выражения в AbsolutePath: $(_Escaped_WPPAllFilesInSingleFolder)\\ErrorLog$, так что проблема не в этом. У вас другое значение Apply, которое может быть ключевым, я не знаю, не возвращаясь к тесту. - person nekno; 21.11.2013

У меня работает: мой полный файл prepprod.pubxml в моей папке App_Data / PublishProfiles в моем веб-решении. Веб-развертывание больше не удаляет файлы из папки cachefiles в веб-развертывании из VS 2015. Первая группа PropertyGroup была автоматически создана с помощью графического интерфейса веб-публикации в Visual Studio. Я добавил вторую PropertyGroup и раздел Target из предыдущих комментариев.

<?xml version="1.0" encoding="utf-8"?>
<!--
This file is used by the publish/package process of your Web project. You can customize the behavior of this process
by editing this MSBuild file. In order to learn more about this please visit http://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <WebPublishMethod>MSDeploy</WebPublishMethod>
    <LastUsedBuildConfiguration>Production</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish>{masked}</SiteUrlToLaunchAfterPublish>
    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <MSDeployServiceURL>{masked}</MSDeployServiceURL>
    <DeployIisAppPath>{masked}</DeployIisAppPath>
    <RemoteSitePhysicalPath />
    <SkipExtraFilesOnServer>False</SkipExtraFilesOnServer>
    <MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
    <MSDeployUseChecksum>true</MSDeployUseChecksum>
    <EnableMSDeployBackup>True</EnableMSDeployBackup>
    <UserName>{masked}</UserName>
    <_SavePWD>True</_SavePWD>
    <PublishDatabaseSettings>
      <Objects xmlns="">
      </Objects>
    </PublishDatabaseSettings>
    <ExcludeFilesFromDeployment>packages.config;*.bat;*.sln;*.suo,*.p4ignore</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>packages;cachefiles;.ebextensions</ExcludeFoldersFromDeployment>
  </PropertyGroup>

  <PropertyGroup>
    <AfterAddIisSettingAndFileContentsToSourceManifest>
      $(AfterAddIisSettingAndFileContentsToSourceManifest);
      AddCustomSkipRules;
    </AfterAddIisSettingAndFileContentsToSourceManifest>
  </PropertyGroup>

  <Target Name="AddCustomSkipRules">
    <Message Text="Adding Custom Skip Rules" />
    <ItemGroup>
      <MsDeploySkipRules Include="SkipcachefilesFolder">
        <objectName>dirPath</objectName>
        <absolutePath>cachefiles</absolutePath>
      </MsDeploySkipRules>
    </ItemGroup>
  </Target>

</Project>
person Avi G    schedule 23.08.2017

Это сработало для меня в сравнении с 2015 годом, тип проекта веб-сайта:

<!--Added inside existing <ProjectGroup> tag-->
<AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest>

<!--Added new ProjectGroup tag inside <Project></Project>-->
<PropertyGroup>
   <WebPublishMethod>MSDeploy</WebPublishMethod>
</PropertyGroup>

<!--Added inside existing <Project> tag at the bottom-->
<Target Name="AddCustomSkipRules">
<Message Text="Adding Custom Skip Rules" />
 <ItemGroup>
  <MsDeploySkipRules Include="SkipConfigFolder">
    <SkipAction></SkipAction>
    <!--<KeyAttribute>Delete</KeyAttribute>-->
    <ObjectName>dirPath</ObjectName>
    <AbsolutePath>App_Data\\Composite\\Logfiles</AbsolutePath>
    <XPath>
    </XPath>
  </MsDeploySkipRules>
 </ItemGroup>
</Target>
person Sgedda    schedule 05.03.2018