Подтвердить что ты не робот

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 в пакет. Не то, что я здесь делаю.)


Пример

Опять же, я был полностью в тупике, поэтому, если вы хотите помочь экспериментировать, я собрал это примерное решение.

4b9b3361

Ответ 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 для вашего примера выше.