Сделайте так, чтобы MSDeploy (Visual Studio) не удалял папку App_Data, а удалял все остальное - PullRequest
56 голосов
/ 27 ноября 2010

Я использую кнопку Publish в Visual Studio для развертывания моего веб-сайта и хочу другую папку App_Data на сервере.Есть флажок для Leave extra files on destination (do not delete), который запрещает удаление моей папки App_Data, но затем она будет накапливать много рудиментарных файлов при изменении сайта.это все удаляет?

Ответы [ 7 ]

93 голосов
/ 14 апреля 2011

Это можно сделать, когда вы вызываете msdeploy вручную - просто добавьте следующий параметр:

-skip:Directory=\\App_Data

См. Параметры операции веб-развертывания .Путь является регулярным выражением, поэтому он достаточно гибкий.

Если вы развертываете с использованием созданного VS сценария ProjectName.deploy.cmd, вы также можете передать этот параметр в переменную среды _MsDeployAdditionalFlags (при запуске этого сценария).).

Это лучшее, что я придумал для наших нужд (у нас такая же ситуация, как у вас).Я не пытался интегрировать его с кнопкой VS публикации, так как мы развертываем из командной строки.

РЕДАКТИРОВАТЬ:

Я узнал кое-что о MSDeploy, так как я опубликовалэтот ответ, поэтому я решил обновить его сейчас.

Прежде всего, вышеупомянутое правило пропуска пропускает любые операции на соответствующем пути (App_Data).Если требуется более детальный контроль, доступен более подробный синтаксис.Например, чтобы пропустить только удаления (сохранить все дополнительные файлы на целевом сервере, но добавить новые и обновить существующие):

-skip:skipaction='Delete',objectname='filePath',absolutepath='\\App_Data\\.*' -skip:skipaction='Delete',objectname='dirPath',absolutepath='\\App_Data\\.*'

Пропускает удаление всех файлов и всех подпапок (со всеми ихcontent) в App_Data, но не предотвращает добавления и обновления.

Еще одна полезная вещь - это то, что правила пропуска могут быть определены в файле проекта (.csproj), чтобы они автоматически включались в .deploy.cmdСценарий генерируется вместе с пакетом.Это избавляет от необходимости передавать их в сценарий через _MsDeployAdditionalFlags.

Приведенное выше правило пропуска будет добавлено, если в файл csproj добавлено следующее:

<PropertyGroup>
  <OnBeforePackageUsingManifest>AddCustomSkipRules</OnBeforePackageUsingManifest>
</PropertyGroup>
<Target Name="AddCustomSkipRules">
  <ItemGroup>
    <MsDeploySkipRules Include="SkipDeleteAppData">
      <SkipAction>Delete</SkipAction>
      <ObjectName>filePath</ObjectName>
      <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath>
      <XPath>
      </XPath>
    </MsDeploySkipRules>
    <MsDeploySkipRules Include="SkipDeleteAppData">
      <SkipAction>Delete</SkipAction>
      <ObjectName>dirPath</ObjectName>
      <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath>
      <XPath>
      </XPath>
    </MsDeploySkipRules>
  </ItemGroup>
</Target>

(имена AddCustomSkipRules и SkipDeleteAppData абсолютно произвольны; $(_Escaped_PackageTempDir) предполагается, что возможно необходимо, но на практике я всегда видел, чтобы оно вычислялось как пустая строка)

См. Web Deploy: настройка пакета развертывания и Как установить параметры MSDeploy в файле .csproj для получения дополнительной информации.

Одно предупреждение: это только добавляет эти правила к .deploy.cmdсценария, поэтому он бесполезен, если вы хотите использовать графический диспетчер IIS для развертывания пакетов, поскольку он не использует этот сценарий (то же самое, вероятно, относится и к развертыванию из VS, но я не проверял).

1 голос
/ 20 октября 2011

Вы смотрели на Package / Publish Web в настройках проекта, потому что вы можете сказать ему исключать файлы в папке App_Data.

0 голосов
/ 25 ноября 2018

Из Powershell, если вы хотите использовать msdeploy.exe или myproj.deploy.cmd ( Развертывание веб-пакетов ), созданный при публикации с помощью пакета Web Deploy, чтобы пропустить удаление папки App_Data и избегать

All arguments must begin with "-"

ошибка, вы должны заключить директиву skip в тройные кавычки, например, :

myproj.deploy.cmd /y /u:myusername /p:mypass """-skip:Directory=\\App_Data"""
0 голосов
/ 26 октября 2018

Для основных веб-приложений asp.net используйте MsDeploySkipRules в csproj.

<ItemGroup>
  <MsDeploySkipRules Include="CustomSkipFile">
    <ObjectName>filePath</ObjectName>
    <AbsolutePath><dir_name>\\app_data</AbsolutePath>
  </MsDeploySkipRules>
  <MsDeploySkipRules Include="CustomSkipFile">
    <ObjectName>dirPath</ObjectName>
    <AbsolutePath><dir_name>\\app_data</AbsolutePath>
  </MsDeploySkipRules>
</ItemGroup>

Замените <dir_name> вашей корневой папкой

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-2.1#exclude-files

0 голосов
/ 26 сентября 2018

Поместите это в ваш файл pubxml:

<ExcludeApp_Data>True</ExcludeApp_Data>
0 голосов
/ 29 августа 2018

Это не идеально, так как вы можете копировать много файлов, делая это (я не), но вот мое решение для резервного копирования папки.Адаптировано для перемещения папки в место, из которого она будет опубликована, во время процесса публикации.Поместите это в ваш файл pubxml:

<Project>
...
<Target Name="PreserveSelectedFolder" AfterTargets="GatherAllFilesToPublish">
   <ItemGroup>
     <SITEDIR Include="$(publishUrl)\App_Data\**\*.*" />
   </ItemGroup>
   <Copy SourceFiles="@(SITEDIR)" 
      DestinationFolder="$(ProjectDir)\obj\$(Configuration)\Package\PackageTmp\%(RecursiveDir)"></Copy>
</Target>
</Project>

И если вы просто хотите использовать любое количество определенных известных файлов, сделайте один блок копирования на файл:

<Target Name="PreserveSelectedFiles" AfterTargets="GatherAllFilesToPublish"  >
    <Copy SourceFiles="$(publishUrl)\MYFILENAME.EXT" 
      DestinationFolder="$(ProjectDir)\obj\$(Configuration)\Package\PackageTmp\" 
      Condition="Exists('$(publishUrl)\MYFILENAME.EXT')"></Copy>
</Target>
0 голосов
/ 07 февраля 2018

По моему опыту, MsDeploySkipRules запускаются только при развертывании из командной строки.

Если вы публикуете из Visual Studio в Azure (или используете другой метод веб-развертывания), вы можете установить следующее, когдаПубликация.

  • Удаление дополнительных файлов в месте назначения
  • Исключение файлов из папки App_Data

Если установлен флажок «Удалить дополнительные файлы в месте назначения», он будетСделайте сравнение между файлами и папками, которые вы развертываете, и файлами на сервере.

Будьте осторожны, вы можете столкнуться с проблемами, если у вас есть пользовательский контент, например, выгрузки.Но это можно обойти, сохранив эти папки в другом месте, например, в хранилище S3 / Azure.

Web Publishing Profile

...