MsBuild и MsDeploy с несколькими средами
Существуют ли хорошие шаблоны для сопоставления конфигураций решений в средах и использования MsDeploy для упаковки на среду?
Кратчайшая версия: Возьмите этот файл и попробуйте изменить файл .msbuild, чтобы создать пакет.
Подробнее
У меня есть решение с большим количеством библиотек и ASP.NET MVC. Я управляю сборкой файлом msbuild, который вызывает основное решение, а затем выполняет другие действия. Я хочу использовать новую упаковку msdeploy для подготовки .zip файла для последующего распространения, но у меня возникают различные трудности.
Мое решение имеет 4 конфигурации: Local
, Dev
, Test
и Prod
, которые соответствуют средам, к которым я хочу привязать. В этом решении все библиотеки имеют Debug
и Release
режимы, как обычно. Например, в режиме решения Local
все библиотеки компилируются в режиме Debug
. Затем основное приложение имеет соответствующие среды с решением, так что я могу иметь Web.Dev.config
и т.д., Что кажется естественным способом использования вещей.
Если я упакую следующим образом:
<Target Name="BuildWebPackage">
<MSBuild Projects="..\Publisher\Site\Site.vbproj"
Targets="Package"/>
</Target>
Я получаю проблему, когда Configuration=Local
неправильно сопоставляется с библиотечными проектами, ссылки на Site.vbproj
и не могут их скомпилировать.
Я вижу два возможных решения: один я не могу работать правильно, а другой очень уродлив.
Попытка 1
Я пытаюсь вызвать цель Package
через решение (в этом примере "Приложения" - это папка с решением, в которой находится проект сайта... Я упростил эту статью для этого сообщения, потому что на самом деле существует несколько приложений в решении.)
<Target Name="BuildWebPackage">
<MSBuild Projects="..\Publisher\Publisher.sln"
Targets="Applications\Site:Package"/>
</Target>
Я думаю, что этот синтаксис SolutionFolder\ProjectName:Target
заключается в том, как это сделать, потому что :Clean
работает... однако, это бросает
error MSB4057: The target "Applications\Site:Package" does not exist in the project.
Попытка 2
Теперь для уродливого решения: он работает, если я изменяю ВСЕ мои библиотеки, чтобы иметь 4 дополнительных конфигурации для этих 4 конфигураций решения. Тем не менее, это уродливый и действительно плохой план, если я хочу совместно разработать общую библиотеку позже с проектом, который имеет разные среды. Кроме того, эти среды не имеют ничего общего с библиотекой и имеют смысл только в контексте приложений верхнего уровня, использующих библиотеки. Вкус плохо.
А?
Мне нравится иметь несколько сред в решении и новые материалы замены Web.config, но я не знаю, как вызвать задачу msdeploy Package
в этой ситуации, чтобы я мог создать пакет в TeamCity.
(Обратите внимание, что я, вероятно, НЕ хочу вызывать командную строку msdeploy, потому что это использовало для превращения приложения IIS в пакет. Не то, что я здесь делаю.)
Пример
Опять же, я был полностью в тупике, поэтому, если вы хотите помочь экспериментировать, я собрал это примерное решение.
Ответы
Ответ 1
Первая попытка не удалась, поскольку в файле решения не существует целевой пакет. При использовании MSBuild в файле решения создается временный проект MSBuild (SamplePackage.sln.metaproj); этот файл проекта содержит только некоторые цели (Build, Clean, Rebuild, Опубликовать,...)
Решение: свойства DeployOnBuild и DeployTarget
Один из способов сделать то, что вы хотите, - это использовать свойство DeployOnBuild:
<PropertyGroup Condition="'$(Configuration)' == ''">
<Platform>Any Cpu</Platform>
<Configuration>Dev</Configuration>
<PackageLocation>$(MSBuildProjectDirectory)\package.zip</PackageLocation>
</PropertyGroup>
<Target Name="Build">
<MSBuild Projects="SamplePackage.sln"
Targets="Build"/>
</Target>
<Target Name="BuildWebPackage">
<MSBuild Projects="SamplePackage.sln"
Properties="Platform=$(Platform);
Configuration=$(Configuration);
DeployOnBuild=true;
DeployTarget=Package;
PackageLocation=$(PackageLocation);"/>
</Target>
- DeployOnBuild = true: развертывание должно выполняться при вызове Build
- DeployTarget = Package: для развертывания создается пакет
- PackageLocation: указывает путь к файлу пакета
Дополнительные ссылки:
Ответ 2
Я сделал нечто похожее, которое может быть полезно. В недавнем проекте у нас были среды "Dev", "Test" и "Prod".
Я добавил конфигурацию решений для каждого из них. Например,
- Release-Dev
- Release-Test
- Release-Prod
Для большинства проектов в решении эти конфигурации были просто связаны с обычной сборкой "Release", но там, где это уместно, некоторые проекты имели разные конфигурации сборки "Release-Test", где может быть # if/# endif stuff в код.
Это также имеет смысл разрешить настройку для вашего конфигуратора msdeploy для каждой конфигурации.
Относительно цели msbuild. Цель ссылается на имя элемента. например, вы могли бы вызвать msbuild с /t: BuildWebPackage для вашего примера выше.