Czy istnieje zalecane podejście do konfigurowania pakietu NuGet ukierunkowanego na wiele frameworków w TeamCity przy użyciu MSBuild?

Przeczytałem kilka postów (zobacz referencje poniżej) i nie znalazłem jeszcze przewodnika na temat najlepszych praktyk, który jest specyficzny dla mojego stosu technologicznego.

Cel: utworzyć pojedynczy pakiet NuGet skierowany do wielu frameworków .NET zbudowanych z jednego.plik csproj poprzez TeamCity przy użyciu MSBuild i NuGet.

Ograniczenia:

  1. wyciągnij kod z VCS tylko raz.
  2. wszystkie skompilowane zespoły powinny być wersjonowane to samo.
  3. singiel .csproj (nie jeden na docelowy framework).

Mam na myśli dwa podejścia:

  1. Utwórz pojedynczą konfigurację kompilacji. Zawiera trzy etapy kompilacji: kompilację. NET 3.5, kompilację. NET 4.0, pack with NuGet. Każdy etap budowy zależałby od sukcesu ostatniego. Jedynym prawdziwym problemem widzę z tym podejściem (i mam nadzieję, że jest rozwiązanie, którego nie jestem świadomy) jest to, że każdy krok budowania wymagałby własnego zestawu budowania parametry (np. system.TargetFrameworkVersion i system.OutputPath), aby wyznaczyć unikalną lokalizację dla biblioteki DLL (np. bin\release\v3.5 i bin\release\v4.0), aby krok NuGet pack mógł wykonać swoje zadanie na podstawie sekcji pliki w .plik nuspec.

  2. Twórz wiele konfiguracji kompilacji. Jedna konfiguracja kompilacji na opisane powyżej kroki kompilacji. Dzięki takiemu podejściu łatwo jest rozwiązać parametry budowania TargetFrameworkVersion i OutputPath problem, ale teraz muszę utworzyć zależności migawek i udostępnić numer wersji assembly w kompilacjach. Zjada również gniazda konfiguracji kompilacji, co jest dla nas ok (ale nie optymalne), ponieważ mamy licencję Enterprise.

Opcja # 1 wydaje się oczywistym wyborem. Opcje # 2 są brudne.

Więc moje dwa pytania to:

  1. Czy możliwe jest tworzenie parametrów, które są unikalne dla etapu budowania?
  2. czy jest trzecia, lepsza podejście?

Referencje:

  1. Multi-framework NuGet build with symbols for internal dependency management
  2. Nuget-pakowanie rozwiązania z wieloma projektami (targeting multiple ramy)
  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
Author: Community, 2013-04-04

2 answers

Oto moje preferowane rozwiązanie (Opcja #1):

Magia polega na niefortunnym obejściu problemu. Jeśli jesteś skłonny do kompromisu, to rozwiązanie działa. Jeśli nie, możesz śledzić problem, który otworzyłem w śledzeniu problemów JetBrains .

Konfiguracja pojedynczego budowania wygląda następująco:

Tutaj wpisz opis obrazka

Zwróć uwagę na nazwę dwóch pierwszych kroków budowania. Są one w rzeczywistości nazwane jawnie jako wartości TargetFrameworkVersion dla. NET Odpowiednio 3,5 i 4,0.

Następnie w sekcji Parametry budowania skonfigurowałem następujące parametry:

Tutaj wpisz opis obrazka

I wreszcie, krok Nuget Pack wykonuje tłumaczenie ścieżki pliku zgodnie z my .sekcja plików nuspec:

<files>
    <file src="bin\release\v3.5\*.*" target="lib\net35" />
    <file src="bin\release\v4.0\*.*" target="lib\net40" />
</files>
 25
Author: David Peden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-17 17:45:39

Oto rozwiązanie przy drugim podejściu:

Projekt zawiera następujące konfiguracje budowania i szablon:

Tutaj wpisz opis obrazka

Generator liczb współdzielonych jest pierwszą kompilacją w łańcuchu. Nie robi nic innego, jak utworzyć numer kompilacji, który zależny buduje będzie dzielić. Używam wtyczki TeamCity Shared Build Number autorstwa Nicholasa Williamsa.

A oto godne uwagi konfiguracje w budowie szablon:

Tutaj wpisz opis obrazka

Uwaga numer kompilacji pochodzi z identyfikatora kompilacji generatora współdzielonych kompilacji, o którym mowa powyżej. Więc, w moim przypadku, ten build ma ID 14. Zwróć również uwagę na zmienną % TargetFrameworkVersion% w ścieżce artefaktu. Na szczęście TeamCity obsługuje interpolację zmienną niemal wszędzie.

Aby szablon mógł wykorzystać numer kompilacji, musi mieć zależność migawkową od tej konfiguracji kompilacji:

Tutaj wpisz opis obrazka

I, wreszcie (jeśli chodzi o szablon), parametry budowania są prawie identyczne z parametrami w moim preferowanym rozwiązaniu. Zwróć jednak uwagę na dodatkowy parametr konfiguracyjny. To jest to, co zostanie nadpisane przez dziedziczące konfiguracje build:

Tutaj wpisz opis obrazka

Następnie, w kompilacjach zależnych, musisz połączyć zależność migawki, aby Numer kompilacji (odziedziczony po szablonie) faktycznie działał, przyjmując również zależność od współdzielonego kompilacji numer kompilacji konfiguracja:

Tutaj wpisz opis obrazka

I oczywiście musisz ustawić rzeczywisty docelowy framework:

Tutaj wpisz opis obrazka

Z rzeczywistą konfiguracją kompilacji, możesz teraz skonfigurować konfigurację kompilacji pakietu NuGet. Nie musisz dołączać do katalogu głównego VCS:

Tutaj wpisz opis obrazka

Ale musisz skonfigurować kilka zależności (zarówno snapshot jak i artefakt):

Tutaj wpisz opis obrazka

I w końcu jesteś skończony.

 14
Author: David Peden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-17 18:04:51