Сделать MSDeploy (Visual Studio) не удалять папку данных приложения, а удалить все остальное
Я использую Visual Studio Publish
кнопка для развертывания моего веб-сайта и требуется другая папка App_Data на сервере. Есть флажок для Leave extra files on destination (do not delete)
что предотвращает удаление моей папки App_Data, но в конечном итоге она будет накапливать много рудиментарных файлов по мере изменения веб-сайта.
есть ли способ сделать его исключить только App_Data, когда он удаляет все?
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.
это не идеально, так как вы можете копировать много файлов, делая это (я не), но вот мое решение для резервного копирования папки. Адаптирована для перемещения папки в место, из которого она будет опубликована, во время процесса публикации. Поместите это в свой файл 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>