Как избежать этой глубокой структуры папок с MSDeploy в файловую систему с помощью MSBuild?

я вытаскиваю волосы из-за этой проблемы MSBuild.

мы используем TeamCity для создания решения с двумя веб-сайтами MVC. В рамках сборки мы развертываем папку на сервере сборки. IIS указывает на эту папку, чтобы предоставить нам сборку интеграции, видимую для управления.

вот код из файла MSBuild, который использует MSDeploy для публикации пакета , но не как zip-файл.

<Target Name="Deploy">
  <MSBuild 
    Projects="$(SolutionFile)"
    Properties="Platform=$(Platform);Configuration=$(Configuration);
    DeployOnBuild=true;
    DeployTarget=Package;
    PackageLocation=$(PackageLocation);
    PackageAsSingleFile=False;
    AutoParameterizationWebConfigConnectionStrings=False" />
</Target>

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

C:DEPLOYArchiveContentC_CUsersEdmondDocumentsVisual Studio 2008CreatioGreenCreatioCodecoretrunkWebsiteWebsiteobjReleasePackagePackageTmp[опубликованные файлы]

Я действительно хочу развернуть в предсказуемые папки, такие как...

C:buildwebsite [опубликованные файлы] C:buildmobilewebsite [опубликованные файлы]

Это фон. Вот конкретные вопросы.

  1. мы делаем ошибку, пытаясь использовать MSDeploy для публикации в локальной файловой системе? Нам в основном нужен эквивалент функции VS2010 "опубликовать" с преобразованиями конфигурации. Мы не пытаемся развернуть на удаленных экземплярах IIS или что-то еще.

  2. есть ли способ сделать это, но указать папки публикации?

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

C:FolderPackageEndsUpIn[ANYFOLDERS]Website[ANYFOLDERS]PackageTmp**.

помогите!

3 ответов


вы можете использовать WebDeploy напрямую, чтобы получить более настроенный результат. Например, вы можете использовать следующую команду для синхронизации 2 папок непосредственно от корня к корню:

>"%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:dirPath=<SourceFolder> -dest:dirPath=<DestinationFolder>

или вы можете сделать WebDeploy включить конфигурацию IIS в месте назначения с помощью поставщика iisApp вместо dirPath:

>"%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:iisApp=<SourceFolderOrIISPath> -dest:iisApp=<DestinationFolderOrIISPath>

например, для синхронизации из простой папки в новое приложение "NewApp" в разделе веб-сайт по умолчанию, вы назовете это путь:

>"%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:iisApp="d:\MyWebSite" -dest:iisApp="Default Web Site/NewApp"

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


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

msbuild C:\PathToMyProj - ... csproj /p:Configuration=UAT;DeployOnBuild=true;PackageAsSingleFile=False;DeployTarget=Package;_PackageTempDir=c:\PathToMyDeploy\;AutoParameterizationWebConfigConnectionstrings=false

эта команда опубликует все мои файлы в c:\PathToMyDeploy\ без сумасшедших вложенных папок


есть немного скрытое, но элегантное решение.

при запуске сборки на общем сервере CI может быть трудно упаковать в C: root по причинам изоляции. В конечном счете, предпочтительнее удалить глубокий путь в самом пакете.

к счастью, есть решение. Добавьте правило замены в.pubxml файл! Я нашел его в дополнении к inside ms build engine, 2nd edition: https://www.microsoft.com/learning/en-us/book.aspx?ID=16854

Я также нашел его в этом блоге: http://learnaspmvc.blogspot.se/2014/07/web-packaging-fixing-long-path-issue.html