Подтвердить что ты не робот

Сделать MSDeploy (Visual Studio) не удалять папку App_Data, но удалять все остальное

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

Есть ли способ сделать его исключающим только App_Data, когда он удаляет все?

4b9b3361

Ответ 1

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

-skip:Directory=\\App_Data

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

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

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

EDIT:

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

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

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

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

Еще одна полезная вещь: правила пропуска можно определить в файле проекта (.csproj), чтобы они автоматически включались в .deploy.cmd script, сгенерированные вместе с пакетом. Это делает ненужным передавать их в script через _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: настройка пакета развертывания и Как установить параметры MSDeploy в файле .csproj для получения дополнительной информации.

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

Ответ 2

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

Ответ 3

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

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

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

Когда "Удалить дополнительные файлы в месте назначения" отмечен, он проведет сравнение между файлами и папками, которые вы развертываете, и теми, которые находятся на сервере.

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

Профиль веб-публикации

Ответ 4

Это не идеально, так как вы можете копировать много файлов, делая это (я не), но здесь мое решение для резервного копирования папки. Адаптирован для перемещения папки в папку, из которой она будет опубликована, во время процесса публикации. Поместите это в свой файл 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>

Ответ 5

Для основных веб-приложений 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

Ответ 6

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

All arguments must begin with "-"

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

myproj.deploy.cmd /y /u:myusername /p:mypass """-skip:Directory=\\App_Data"""

Ответ 7

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

<ExcludeApp_Data>True</ExcludeApp_Data>