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:
- wyciągnij kod z VCS tylko raz.
- wszystkie skompilowane zespoły powinny być wersjonowane to samo.
- singiel .csproj (nie jeden na docelowy framework).
Mam na myśli dwa podejścia:
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.
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:
- Czy możliwe jest tworzenie parametrów, które są unikalne dla etapu budowania?
- czy jest trzecia, lepsza podejście?
Referencje:
- Multi-framework NuGet build with symbols for internal dependency management
- Nuget-pakowanie rozwiązania z wieloma projektami (targeting multiple ramy)
- http://lostechies.com/joshuaflanagan/2011/06/23/tips-for-building-nuget-packages/
- http://msdn.microsoft.com/en-us/library/hh264223.aspx
- https://stackoverflow.com/a/1083362/607701
- http://confluence.jetbrains.com/display/TCD7/Configuring + Build + Parameters
- http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package
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:
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:
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>
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:
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:
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:
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:
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:
I oczywiście musisz ustawić rzeczywisty docelowy framework:
Z rzeczywistą konfiguracją kompilacji, możesz teraz skonfigurować konfigurację kompilacji pakietu NuGet. Nie musisz dołączać do katalogu głównego VCS:
Ale musisz skonfigurować kilka zależności (zarówno snapshot jak i artefakt):
I w końcu jesteś skończony.
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