2013-04-10 4 views
6

У меня есть следующая настройка: 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, чтобы заставить преобразование конфигурации произойти?

спасибо.

+0

У вашей цели 'AfterBuild' нет выходов. Кажется, что MSBuild пропускает эту цель, думая, что она обновлена. Добавьте выходные данные ('Web.Config' в вашем случае) к целевым выводом' AfterBuild'. – Romeo

+1

Может быть, использовать «BeforeBuild»? Кстати, у вас есть web.config, включенный в csproj? Я считаю, что большинство публикаций публикуются в проектах, а не в папке, но не проверяли. Если нет - вы можете включить веб.config в проекте, но все же исключили его из источника управления – Lanorkin

+0

@Lanorkin - это сработало! Большое спасибо - напишите свой комментарий в качестве ответа. – avs099

ответ

4

Возможно использование «BeforeBuild»?

Кстати, у вас есть web.config, включенный в csproj? Я считаю, что большинство публикаций публикуются в проектах, а не в папке. Вы можете включить web.config в проект, но все же исключили его из исходного управления.

+1

Я использовал цель «BeforeBuild», и она сработала. – avs099

+0

@ avs099, вам нужно включить web.config в проект или в исходный элемент управления? (хотя он будет перезаписан преобразованием ...) – Mobigital

+0

@Mobigital я не включаю его – avs099

Смежные вопросы