Как я могу избежать этой глубокой структуры папок с 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: deploy archive content c_c users edmond documents visual Studio 2008 creatiogreen creatio code core trunk websity websity obj release package packagetmp [опубликованные файлы
Я действительно хочу развернуть в предсказуемых папках, таких как ...
C: build websity [опубликованные файлы] C: build mobileWebsite [опубликованные файлы
Это фон. Вот конкретные вопросы.
Мы делаем ошибку, пытаясь использовать MSDeploy для публикации в локальную файловую систему? Нам в основном нужен эквивалент функции VS2010 «Публикация» с преобразованием конфигурации. Мы не пытаемся развернуть для удаленных экземпляров IIS или чего -то еще.
Есть ли способ сделать это, но указать папки публикации?
Я пытался использовать задачу копии MSBuild для копирования файлов в более разумные папки - но я не могу понять, как использовать подстановки, чтобы указать папки, которые нам нужно взять - это должно быть что -то вроде ...
C: foterpackageendendupin [an -worlolders] websity [an -workfolders] packagetmp**.
Помощь!
Решение
Вы можете использовать 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; deploonbuild = true; packageassingsinglefile = false; deployTarget = package; _packageTempdir = c: pathtomydeploy ; autoParametizationWebConfigConnectionStrings = falseDeploy ; AutoParametizationWebConfigConnectionStrings
Эта команда опубликует все мои файлы в C: PathtomyDeploy Без сумасшедших подпапок
Существует слегка скрытое, но элегантное решение.
При запуске сборки на общем CI -сервере может быть трудно упаковать в C: ROY по соображениям изоляции. В конечном итоге можно предпочесть удалить глубокий путь в самом пакете.
К счастью, есть решение. Добавьте правило замены в файл .pubxml! Я нашел его в дополнение к двигателю внутри MS Build, 2 -е издание: https://www.microsoft.com/learning/en-us/book.aspx?id=16854
Я также нашел это в этом блоге: http://learnaspmvc.blogspot.se/2014/07/web-packaging-fixing-long-path-issue.html