MsBuild и MsDeploy с несколькими средами

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

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


Подробности

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

Мое решение имеет 4 конфигурации: Local , Dev , Test и Prod , которые соответствуют средам, которые я хочу отобразить. В этом решении все библиотеки имеют режимы Debug и Release , как обычно. Например, в режиме решения Local все библиотеки компилируются в режиме Debug . Затем основное приложение имеет соответствующие среды с решением, так что у меня может быть Web.Dev.config и т. Д., Что кажется естественным способом использования вещей.

Если я упаковываю вот так :


  

У меня проблема, когда Configuration = Local неправильно сопоставлен с проектами библиотеки, на которые ссылается Site.vbproj , и он не может их скомпилировать.


Я вижу два возможных решения: одно я не могу заставить работать правильно, а другое крайне уродливо.

Попытка 1

Я пытаюсь вызвать цель Package через решение (в этом Например, «Приложения» это папка решения, в которой находится проект Site ... Я упростил эту статью, поскольку в решении фактически есть несколько приложений.)


  

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


Пример

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

33
задан Dan Fitch 24 August 2010 в 14:48
поделиться

2 ответа

Первая попытка не удалась, так как целевой Пакет не существует в файле решения. При использовании MSBuild для файла решения создается временный проект MSBuild (SamplePackage.sln.metaproj); этот файл проекта содержит только некоторые цели (Build, Clean, Rebuild, Publish, ...)

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

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

40
ответ дан 27 November 2019 в 18:37
поделиться

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

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

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

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

Это также имело бы смысл, чтобы позволить настраивать конфигурацию msdeploy для каждой конфигурации.

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

0
ответ дан 27 November 2019 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: