У меня есть следующая настройка: ASP.Net MVC. Net 4.0 решение с 5 проектами в нем и несколько конфигураций решений (Site1-Stage, Site1-Live, Site2-Stage и т. Д.). Причина этого проста: мы развертываем одну и ту же базу кода на несколько серверов с разными настройками конфигурации.MSBuild - как заставить объект «AfterBuild» при развертывании?
Чтобы управлять этими конфигурациями, я использую подход, описанный Трой Хант в его статье You're deploying it wrong! TeamCity, Subversion & Web Deploy part 1: Config transforms. В 2-х словах - я не имею 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" (rebuild target) (1) -> "MySolution\MyWebProj.csproj" (Rebuild target) (3) -> (PreTransformWebConfig target) -> C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.5\Web\Microsoft.Web.Publishing.targets(1399,5): error : Copying file Web.config to obj\Site1-Stage\TransformWebConfig\original\Web.config failed. Could not find file '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, чтобы заставить преобразование конфигурации произойти?
спасибо.
У вашей цели 'AfterBuild' нет выходов. Кажется, что MSBuild пропускает эту цель, думая, что она обновлена. Добавьте выходные данные ('Web.Config' в вашем случае) к целевым выводом' AfterBuild'. – Romeo
Может быть, использовать «BeforeBuild»? Кстати, у вас есть web.config, включенный в csproj? Я считаю, что большинство публикаций публикуются в проектах, а не в папке, но не проверяли. Если нет - вы можете включить веб.config в проекте, но все же исключили его из источника управления – Lanorkin
@Lanorkin - это сработало! Большое спасибо - напишите свой комментарий в качестве ответа. – avs099