Сделать MSDeploy (Visual Studio) не удалять папку данных приложения, а удалить все остальное


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

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

5 54

5 ответов:

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

-skip:Directory=\App_Data

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

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

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

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 скрипт генерируется вместе с пакетом. Это делает его ненужным передайте их скрипту через _MsDeployAdditionalFlags.

вышеуказанное правило пропуска будет добавлено, если в csproj file:

<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 file для получения дополнительной информации.

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

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

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

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

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

при "удалить дополнительные файлы в месте назначения" включена опция сравнения файлов и папок вы развертываете и на сервере.

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

Web Publishing Profile

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

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

<ExcludeApp_Data>True</ExcludeApp_Data>