Существуют ли хорошие шаблоны для сопоставления конфигураций решения с средами и использования MsDeploy для упаковки в среде?
Кратчайшая версия: Захватите этот файл и попробуйте изменить файл .msbuild так, чтобы пакет создан.
У меня есть решение с большим количеством библиотек и приложением ASP.NET MVC. Я запускаю сборку с помощью файла msbuild, который вызывает основное решение, а затем выполняет другие действия. Я хочу использовать новую упаковку msdeploy для подготовки файла .zip для последующего распространения, но у меня возникают различные трудности.
Мое решение имеет 4 конфигурации: Local
, Dev
, Test
и Prod
, которые соответствуют средам, которые я хочу отобразить. В этом решении все библиотеки имеют режимы Debug
и Release
, как обычно. Например, в режиме решения Local
все библиотеки компилируются в режиме Debug
. Затем основное приложение имеет соответствующие среды с решением, так что у меня может быть Web.Dev.config
и т. Д., Что кажется естественным способом использования вещей.
Если я упаковываю вот так :
У меня проблема, когда Configuration = Local
неправильно сопоставлен с проектами библиотеки, на которые ссылается Site.vbproj
, и он не может их скомпилировать.
Я вижу два возможных решения: одно я не могу заставить работать правильно, а другое крайне уродливо.
Я пытаюсь вызвать цель Package
через решение (в этом Например, «Приложения» это папка решения, в которой находится проект Site ... Я упростил эту статью, поскольку в решении фактически есть несколько приложений.)
Я думаю, что это SolutionFolder \ ProjectName: Target
синтаксис, как это сделать, потому что : Clean
выполняется ... однако, это бросает
error MSB4057: The target "Applications\Site:Package" does not exist in the project.
Теперь для уродливого решения: это работает, если я изменю ВСЕ мои библиотеки, чтобы иметь 4 дополнительных конфигурации для этих 4 конфигураций решения. Тем не менее, это уродливый и действительно плохой план, если я захочу позже совместно использовать общую библиотеку с проектом, который имеет другие среды. Кроме того, эти среды не имеют ничего общего с библиотекой и имеют смысл только в контексте приложений верхнего уровня, использующих библиотеки. Вкус плохой.
Мне нравится иметь несколько сред в решении, и новые необычные вещи для замены Web.config, но я не знаю, как вызвать задачу msdeploy Package
в этой ситуации, чтобы я мог собрать пакет в TeamCity.
(Обратите внимание, что я, вероятно, делаю НЕ хочу вызывать командную строку msdeploy, потому что она используется для превращения приложения IIS в пакет. Не то, что я здесь делаю.)
Опять же, я был полностью озадачен здесь, так что если вы хочу помочь в эксперименте, я собрал этот пример решения .
Первая попытка не удалась, так как целевой Пакет не существует в файле решения. При использовании MSBuild для файла решения создается временный проект MSBuild (SamplePackage.sln.metaproj); этот файл проекта содержит только некоторые цели (Build, Clean, Rebuild, Publish, ...)
Один из способов сделать то, что вы хотите, — это использовать свойство 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>
Дополнительные ссылки :
Я сделал нечто подобное, что может оказаться полезным. В недавнем проекте у нас были среды 'Dev', 'Test' и 'Prod'.
Я добавил конфигурации решения для каждой из них. Например,
Для большинства проектов в решении эти конфигурации были просто связаны с обычной сборкой 'Release', но там, где это было необходимо, некоторые проекты имели отдельные конфигурации сборки 'Release-Test', где в коде могли быть #if/#endif.
Это также имело бы смысл, чтобы позволить настраивать конфигурацию msdeploy для каждой конфигурации.
Что касается цели msbuild. Цель относится к имени элемента. Например, вы можете вызвать msbuild с /t:BuildWebPackage для вашего примера выше.