Есть ли рекомендуемый подход к настройке пакета NuGet для нескольких платформ в TeamCity с помощью MSBuild?

Я прочитал несколько сообщений (см. Ссылки ниже) и еще не нашел руководства по передовым методам, относящимся к моему техническому стеку.

Цель: создать единый пакет NuGet, ориентированный на несколько платформ .NET, построенных из одного файла .csproj через TeamCity с использованием MSBuild и NuGet.

Ограничения:

  1. Вытяните код из VCS только один раз.
  2. Все скомпилированные сборки должны иметь одинаковую версию.
  3. Один .csproj (не один на целевую платформу).

У меня есть два подхода:

  1. Создайте единую конфигурацию сборки. Он будет содержать три этапа сборки: компилировать .NET 3.5, компилировать .NET 4.0, упаковывать с NuGet. Каждый шаг сборки будет зависеть от успеха последнего. Единственная реальная проблема, которую я вижу в этом подходе (и, надеюсь, есть решение, о котором я не знаю), заключается в том, что для каждого шага сборки потребуется собственный набор параметров сборки (например, system.TargetFrameworkVersion и system.OutputPath) для обозначения уникальное место для размещения DLL (например, bin \ release \ v3.5 и bin \ release \ v4.0), чтобы этап пакета NuGet мог выполнять свои функции на основе раздела Files в файле .nuspec.

  2. Создайте несколько конфигураций сборки. Одна конфигурация сборки на этапы сборки, описанные выше. При таком подходе легко решить проблему параметров сборки TargetFrameworkVersion и OutputPath, но теперь мне нужно создать зависимости моментальных снимков и поделиться номером версии сборки между сборками. Он также съедает слоты конфигурации сборки, что для нас нормально (но не оптимально), поскольку у нас есть лицензия Enterprise.

Вариант №1 кажется очевидным. Вариант №2 кажется грязным.

Итак, у меня два вопроса:

  1. Можно ли создать параметры, уникальные для этапа сборки?
  2. Есть ли третий, лучший подход?

Ссылки:

  1. Мультифреймворковая сборка NuGet с символами для управления внутренними зависимостями < / а>
  2. Nuget - упаковка решения с несколькими проектами (для нескольких фреймворков )
  3. http://lostechies.com/joshuaflanagan/2011/06/23/tips-for-building-nuget-packages/
  4. http://msdn.microsoft.com/en-us/library/hh264223.aspx
  5. https://stackoverflow.com/a/1083362/607701
  6. http://confluence.jetbrains.com/display/TCD7/Configuring+Build+Parameters
  7. http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package

person David Peden    schedule 04.04.2013    source источник
comment
Я нашел решения, используя оба подхода, и скоро опубликую отдельные ответы (как только позволит время).   -  person David Peden    schedule 16.04.2013
comment
Я жду, затаив дыхание ;-) По совпадению, у меня такое же требование.   -  person Tim Long    schedule 17.04.2013
comment
Ха-ха, Тим. Я узнал ваше имя из обсуждения информации о сборке на youtrack (youtrack.jetbrains.com/issue/TW-27596). Мы с вами следим за одним и тем же вопросом. На этой неделе я постараюсь опубликовать два своих ответа. ;)   -  person David Peden    schedule 17.04.2013


Ответы (2)


Вот мое предпочтительное решение (вариант №1):

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

Конфигурация одиночной сборки выглядит так:

введите описание изображения здесь

Обратите внимание на название первых двух шагов сборки. Фактически, они явно названы как значения TargetFrameworkVersion для .NET 3.5 и 4.0 соответственно.

Затем в разделе «Параметры сборки» я настроил следующие параметры:

введите описание изображения здесь

И, наконец, шаг Nuget Pack выполняет перевод пути к файлу в соответствии с моим разделом файлов .nuspec:

<files>
    <file src="bin\release\v3.5\*.*" target="lib\net35" />
    <file src="bin\release\v4.0\*.*" target="lib\net40" />
</files>
person David Peden    schedule 17.04.2013
comment
+1 за оба ответа, потому что вы нашли время написать полноценное руководство - person stijn; 12.07.2013
comment
Вот еще один способ, который не включает никаких параметров TeamCity и полностью выполняется с использованием конфигурации сборки проекта Visual Studio, nuspec и сборки Team City: stackoverflow.com/questions/40046710/ - person Robin French; 26.10.2016

Вот решение, основанное на втором подходе:

Проект содержит следующие конфигурации сборки и шаблон:

введите описание изображения здесь

Генератор номеров общих сборок - это первая сборка в цепочке. Он не делает ничего, кроме создания номера сборки, который будут совместно использоваться зависимыми сборками. Я использую подключаемый модуль, упомянутый в TeamCity, Общий номер сборки Николаса Уильямса.

А вот примечательные конфигурации в шаблоне сборки:

введите описание изображения здесь

Обратите внимание, что номер сборки берется из идентификатора сборки генератора общих номеров сборки, упомянутого выше. Итак, в моем случае это идентификатор сборки 14. Также обратите внимание на переменную% TargetFrameworkVersion% в пути артефакта. К счастью, TeamCity поддерживает интерполяцию переменных почти везде.

Чтобы шаблон мог использовать номер сборки, он должен иметь зависимость моментального снимка от этой конфигурации сборки:

введите описание изображения здесь

И, наконец (что касается шаблона), параметры сборки почти идентичны параметрам в моем предпочтительном решении. Однако обратите внимание на дополнительный параметр конфигурации. Вот что будет переопределено унаследованными конфигурациями сборки:

введите описание изображения здесь

Затем в зависимых сборках вы должны подключить зависимость моментального снимка, чтобы номер сборки (унаследованный от шаблона) действительно работал, также принимая зависимость от общей конфигурации сборки номера сборки:

введите описание изображения здесь

И, конечно же, вам нужно установить фактическую целевую структуру:

введите описание изображения здесь

Настроив фактические сборки, теперь вы можете настроить конфигурацию сборки пакета NuGet. Вам не нужно подключаться к корню VCS:

введите описание изображения здесь

Но вам нужно настроить кучу зависимостей (как снимок, так и артефакт):

введите описание изображения здесь

И, наконец, все готово.

person David Peden    schedule 17.04.2013
comment
У меня такая же проблема, и я использовал версию вашего решения. Однако у меня возникают проблемы с компонентом, который я создаю, используя пакеты NuGet. Я нацелен на версии 4.0 и 4.5, и у меня есть зависимость от EntityFramework 6.x. Когда я создаю свою версию 4.0 MY пакета, я хочу, чтобы она использовала ту же версию EF. Я еще не дошел до того, чтобы опробовать различные сценарии переустановки, но, судя по моим исследованиям, они кажутся ошибочными. - person bigfoot; 17.02.2014