MsBuild и MsDeploy с несколькими средами - PullRequest
33 голосов
/ 17 августа 2010

Существуют ли хорошие шаблоны для сопоставления конфигураций решения с средами и использования MsDeploy для упаковки в среде?

Кратчайшая версия: Захватите этот файл и попробуйте изменить файл .msbuild так, чтобы пакет былсоздал.


Подробности

У меня есть решение с большим количеством библиотек и приложением ASP.NET MVC.Я запускаю сборку с помощью файла msbuild, который вызывает основное решение, а затем выполняет другие действия.Я хочу использовать новую упаковку msdeploy для подготовки файла .zip для последующего распространения, но у меня возникают различные трудности.

Мое решение имеет 4 конфигурации: Local, Dev, TestProd, которые соответствуют условиям, которые я хочу отобразить.В этом решении все библиотеки имеют режимы 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 в пакет.Не то, что я здесь делаю.)


Образец

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

Ответы [ 2 ]

40 голосов
/ 25 августа 2010

Первая попытка не удалась, потому что Пакет target не существует в файле решения.При использовании MSBuild для файла решения создается временный проект MSBuild ( SamplePackage.sln.metaproj );Этот файл проекта содержит только некоторые цели ( Сборка , Очистка , Перестройка , Публикация , ...)

Решение: свойства 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: указывает путь к файлу пакета

Дополнительные ссылки:

0 голосов
/ 20 августа 2010

Я сделал нечто подобное, что может быть полезно.В недавнем проекте у нас были среды 'Dev', 'Test' и 'Prod'.

Я добавил конфигурации решений для каждой из этих .. например.

  • Release-Dev
  • Release-Test
  • Release-Prod

Для большинства проектов в решении эти конфигурации были просто связаны с обычной сборкой Release, но там, где это необходимонекоторые проекты имели отдельные конфигурации сборки Release-Test, где в коде может быть # if / # endif.

Это также имеет смысл разрешить настройку конфигурации msdeploy для каждой конфигурации.

Относительно цели msbuild.Цель ссылается на имя элемента.Например, вы можете вызвать msbuild с помощью / t: BuildWebPackage для вашего примера выше.

...