MSBuild - как заставить цель "AfterBuild", когда я делаю развертывание?
У меня есть следующие настройки: решение ASP.Net MVC .Net 4.0 с 5 проектами и несколькими конфигурациями решения (Site1-Stage, Site1-Live, Site2-Stage и т. Д.). Причина этого проста - мы размещаем одну и ту же кодовую базу на нескольких серверах с разными настройками конфигурации.
Чтобы управлять этими конфигурациями, я использую подход, описанный Троем Хантом в его " Вы неправильно его развернули!" TeamCity, Subversion и Web Deploy часть 1: Config преобразует статью. В двух словах - у меня нет web.config в моем репозитории SVN, вместо этого у меня есть задача Web.Base.Config, Web.Site1-Stage.Config и т. Д., А также задача XmlTransformation в цели проекта AfterBuild. Во время сборки требуемый файл web.config генерируется на основе выбранной конфигурации:
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild">
<TransformXml Source="Web.Base.config" Transform="Web.$(Configuration).config" Destination="Web.config" StackTrace="true" />
</Target>
Здесь возникает проблема: когда я выполняю MSBuild следующим образом:
msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild
все идет хорошо, web.config правильно сгенерирован для конфигурации Site1-Stage. Однако, если я запускаю эту команду:
msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild /P:DeployOnBuild=True
Я получаю следующую ошибку:
"MySolution.sln" (цель перестроения) (1) -> "MySolution\MyWebProj.csproj" (цель перестройки) (3) -> (цель PreTransformWebConfig) -> C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.5\Web\Microsoft.Web.Publishing.targets(1399,5): ошибка: ошибка копирования файла Web.config в obj\Site1-Stage\TransformWebConfig\original\Web.config. Не удалось найти файл "Web.config". [MySolution\MyWebProj.csproj]
Я попытался явно добавить цель "AfterBuild" в командную строку MSBuild:
msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild,AfterBuild /P:DeployOnBuild=True
но это привело к той же ошибке.
Зачем мне это нужно: это очень изолированный пример, и на самом деле я пытаюсь настроить автоматическую публикацию с сервера TeamCity CI. Я думаю, что если я добавлю новый шаг сборки с помощью бегуна "Visual Studio (sln)" ПЕРЕД моим текущим шагом публикации, это сработает, он сначала перестроит проект (и сгенерирует web.config) - а затем опубликует. Тем не менее, у меня есть много шагов публикации (около 20 сейчас), и я хотел бы избежать этого. Насколько я понимаю, процесс "Публикация" выполняет сборку как его часть, поэтому я хотел бы "повторно использовать" это.
Вопрос: как мне изменить командную строку MSBuild, чтобы преобразование конфигурации происходило?
Спасибо.
1 ответ
Может быть, использовать "BeforeBuild"?
Кстати, у вас есть web.config включен в csproj? Я считаю, что большинство публикаций зависит от элементов проекта, а не от папки. Вы можете включить web.config в проект, но при этом исключить его из системы контроля версий.