Najlepsze praktyki/wskazówki dotyczące utrzymywania numerów wersji montażowych

Szukam wskazówek, sugestii, a nawet dyktowania, jak zarządzać trzema różnymi numerami wersji Złożenia dla zestawu. NET. Wersja produktu jest najprostsza, ponieważ wydaje się, że normalnie byłoby to podyktowane przez biznes. Następnie Wersja pliku wydaje się być do wersjonowania między wdrożeniami, gdzie rzeczywista wersja złożenia jest używana tylko podczas wysyłki.

W tej chwili Szukam tylko prostego sposobu etykietowania wersji testowych i konserwacyjnych zespołu na które nie zależą, więc patrzę na auto-incrementing build i revision numbers na wersji pliku, a dla ostatecznego wydania, kopiowanie bieżącej wersji pliku do wersji assembly. Produkt jest w użyciu produkcyjnym, ale nadal w fazie rozwoju-wiesz - jedna z tych małych firm, bez sytuacji kontroli zmian infrastruktury.

Author: johnfound, 2010-09-22

5 answers

Wersjonowanie jest czymś, co bardzo mnie pasjonuje i spędziłem długi czas próbując wymyślić łatwy w użyciu system wersjonowania. Z tego, co już powiedziałeś w swoim pytaniu, jasne jest, że zrozumiałeś jeden ważny punkt, numery wersji montażu nie są synonimem wersji produktu. Jeden jest napędzany technicznie, a drugi jest napędzany przez biznes.

Poniższe założenie zakłada, że używasz jakiejś formy kontroli źródeł i serwera kompilacji. Na kontekst używamy TeamCity i Subversion / Git. TeamCity jest darmowy dla małej (10) liczby projektów i jest bardzo dobrym serwerem budowania, ale są inne, z których niektóre są CAŁKOWICIE DARMOWE.

Co oznacza numer wersji

To, co oznacza wersja dla jednej osoby, może oznaczać coś innego dla drugiej, ogólna struktura to major, minor, makro, mikro. Sposób, w jaki patrzę na numer wersji, polega na rozbiciu go na dwie części. Pierwsza połowa opisuje główną wersję (Major) i wszelkie aktualizacje klawiszy (Minor). Druga połowa wskazuje, kiedy została zbudowana i jaka była wersja kodu źródłowego. Numery wersji oznaczają również różne rzeczy w zależności od kontekstu, czy to API, aplikacja internetowa itp.

Major.Minor.Build.Revision

  • Revision jest to liczba pobrana z kontroli źródła, aby określić, co został zbudowany.
  • Build jest to stale rosnąca liczba, która może być wykorzystana do znalezienia konkretny build na serwerze build. Jest to ważna liczba, ponieważ serwer build mógł zbudować ten sam źródło dwukrotnie z innym zestawem parametry. Korzystanie z numeru kompilacji w koniunkcja z numerem źródłowym pozwala zidentyfikować, co zostało zbudowane i jak.
  • Minor powinno się to zmienić tylko wtedy, gdy nastąpi istotna zmiana na publiczny interfejs. Na przykład, jeśli jest to API, czy kod nadal będzie możliwość kompilacji? Liczba ta powinna zostać zresetowana do zera, gdy główna Liczba się zmieni.
  • Major wskazuje jaka wersja produkt, na którym jesteś. Na przykład Najważniejsze ze wszystkich VisualStudio 2008 assemblies is 9 and VisualStudio 2010 10.

Wyjątek od reguły

Zawsze są wyjątki od reguły i będziesz musiał się dostosować, gdy je napotkasz. Moje oryginalne podejście opierało się na subversion, ale ostatnio przeniosłem się do Git. Sterowanie źródłami, takie jak subversion i source safe, które używają centralnego repozytorium, ma numer, który można wykorzystać do zidentyfikuj konkretny zestaw źródeł z danego czasu. Tak nie jest w przypadku rozproszonej kontroli źródeł, takiej jak Git. Ponieważ Git używa rozproszonych repozytoriów, które są na każdej maszynie deweloperskiej, nie ma automatycznego zwiększania liczby, której możesz użyć, jest hack, który wykorzystuje liczbę check-in, ale jest brzydki. Z tego powodu musiałem ewoluować swoje podejście.

Major.Minor.Macro.Build

Numer wersji zniknął, build przesunął się tam, gdzie Wersja kiedyś było i wstawiono Makro. Możesz użyć makra jak uważasz za stosowne, ale większość czasu zostawiam go w spokoju. Ponieważ używamy TeamCity informacje utracone z numeru wersji można znaleźć w kompilacji, oznacza to, że istnieje dwuetapowy proces, ale nie straciliśmy niczego i jest akceptowalnym kompromisem.

Co ustawić

Pierwszą rzeczą do zrozumienia jest to, że wersja złożenia, Wersja pliku i Wersja produktu nie muszą się zgadzać. Nie jestem zwolennikiem posiadania różne zestawy liczb, ale to sprawia, że życie jest o wiele łatwiejsze podczas dokonywania małych zmian w złożeniu, które nie wpływa na żadnych publicznych interfejsów, które nie są zmuszeni do rekompilacji zależnych złożeń. Sposób, w jaki sobie z tym radzę, polega na tym, aby ustawić tylko numery główne i poboczne w wersji Assembly, ale ustawić wszystkie wartości w wersji pliku. Na przykład:

  • 1.2.0.0 (AssemblyVersion)
  • 1.2.3.4 (FileVersion)

Daje to możliwość wprowadzania poprawek które nie złamie istniejącego kodu, ponieważ wersje assembly nie pasują, ale pozwalają zobaczyć wersję / kompilację assembly patrząc na jego numer wersji pliku. Jest to powszechne podejście i można je zobaczyć na niektórych złożeniach open source, gdy spojrzysz na szczegóły złożenia.

Ty jako dowódca drużyny musiałbyś być odpowiedzialny za zwiększenie liczby podrzędnej, gdy wymagana jest zmiana łamania. Jednym z rozwiązań pozwalających na wprowadzenie wymaganej zmiany w interfejsie, ale nie złamanie poprzedniego kodu polega na oznaczeniu bieżącego jako przestarzałego i utworzeniu nowego interfejsu. Oznacza to, że istniejący kod jest ostrzegany, że metoda jest przestarzała i może zostać usunięta w dowolnym momencie, ale nie wymaga natychmiastowego łamania wszystkiego. Następnie można usunąć przestarzałą metodę, gdy wszystko zostało przeniesione.

Jak to połączyć

Możesz zrobić to wszystko ręcznie, ale byłoby to bardzo czasochłonne, poniżej przedstawiamy sposób automatyzacji procesu. Każdy stopień można uruchomić.

  • Usuń AssemblyVersion oraz AssemblyFileVersion atrybuty z całego projektu AssemblyInfo.pliki cs.
  • Utwórz wspólny plik informacji o złożeniu (nazwij go VersionInfo.cs) i dodaj go jako połączony element do wszystkich swoich projektów.
  • Dodaj atrybuty AssemblyVersion i AssemblyFileVersion do wersji o wartościach "0.0.0.0".
  • Utwórz projekt MsBuild, który zbuduje plik rozwiązania.
  • Dodaj zadanie przed kompilacją, które aktualizuje VersionInfo.cs. Istnieje wiele bibliotek MsBuild open source, które zawierają zadanie AssemblyInfo, które może ustawić numer wersji. Wystarczy ustawić dowolną liczbę i przetestować.
  • Dodaj grupę właściwości zawierającą właściwość dla każdego z segmentów numeru kompilacji. Tutaj ustawiasz dur i Moll. Numer kompilacji i wersji powinien być przekazywany jako argument.

Z subversion:

<PropertyGroup>
    <Version-Major>0</Version-Major>
    <Version-Minor>0</Version-Minor>
    <Version-Build Condition=" '$(build_number)' == '' ">0</Version-Build>
    <Version-Build Condition=" '$(build_number)' != '' ">$(build_number)</Version-Build>
    <Version-Revision Condition=" '$(revision_number)' == '' ">0</Version-Revision>
    <Version-Revision Condition=" '$(revision_number)' != '' ">$(revision_number)</Version-Revision>
</PropertyGroup>

Mam nadzieję, że wyraziłem się jasno, ale jest wiele zaangażowany. Prosimy o zadawanie pytań. Wykorzystam wszelkie opinie, aby umieścić bardziej zwięzły post na blogu.

 200
Author: Bronumski,
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
2016-11-30 12:55:29

[AssemblyVersion] to bardzo ważna sprawa w .NET. jedną z filozofii, wspieraną przez Microsoft jest to, że pozwalasz jej na automatyczną inkrementację, zmuszając wszystkie projekty, które zależą od assembly, do rekompilacji. Działa okayish jeśli używasz serwera budowania. To nigdy nie jest złe, ale uważaj na ludzi noszących miecze.

Druga, ściślej związana z jej rzeczywistym znaczeniem, polega na tym, że liczba jest reprezentatywna dla wersji interfejsu publicznego montaż. Innymi słowy, zmieniasz go tylko wtedy, gdy zmieniasz publiczny interfejs lub klasę. Ponieważ tylko taka zmiana wymaga rekompilacji klientów zestawu. Należy to zrobić ręcznie, jednak system budowania nie jest wystarczająco inteligentny, aby automatycznie wykryć taką zmianę.

Można jeszcze bardziej rozszerzyć to podejście, zwiększając tylko wersję, gdy zespół został wdrożony na maszynach poza twoim zasięgiem. Jest to podejście, którego używa Microsoft, ich wersja. Net assemblies liczby bardzo rzadko się zmieniają. Głównie ze względu na bardzo znaczny ból, który powoduje na swoich klientów.

Więc to, co Microsoft głosi, nie jest tym, co praktykuje. Jego proces budowania i kontrola wersji jest jednak niezrównana, mają nawet dedykowanego inżyniera oprogramowania, który monitoruje proces. WaitHandle nie wyszło zbyt dobrze.WaitOne (int) przeciążenie w szczególności powodowało sporo bólu. Poprawione w. NET 4.0 z zupełnie innym podejściem, ale to trochę poza zakres.

To raczej od Ciebie i Twojej pewności, jak dobrze możesz kontrolować proces budowania i cykle wydań, aby dokonać własnego wyboru. Poza tym, automatyczne zwiększanie [AssemblyFileVersion] jest bardzo odpowiednie. Jednak z niedogodnością, że jest to nie obsługiwane.

 56
Author: Hans Passant,
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
2012-09-03 12:46:28

Możesz użyć części kompilacji numeru wersji do automatycznego zwiększania.

[assembly: AssemblyVersion("1.0.*")]

W Twoim środowisku wersja testowa jest wersją, która ma wersję build != 0. Po wydaniu zwiększasz część podrzędną i ustawiasz część kompilacyjną na 0, w ten sposób identyfikujesz wydane złożenia.

Jeśli zainstalujesz swoje zespoły w GAC, Twój GAC z czasem zaleje się wieloma różnymi wersjami, więc miej to na uwadze. Ale jeśli używasz bibliotek DLL tylko lokalnie, myślę, że jest to dobra praktyka.

 11
Author: testalino,
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-12-23 14:54:56

Dodając do Bronumskis odpowiedź , chcę zaznaczyć, że po standardzie Semantic Versioning 2.0 na semver.org, Major.Minor.Build.Revision byłoby to nielegalne ze względu na zasadę, że po zwiększeniu liczby, wszystkie regularne wartości po prawej stronie musiałyby zostać zresetowane do zera.

Lepszym sposobem podążania za standardem byłoby użycie Major.Minor+Build.Revision. To nie jest do użytku w AssemblyVersionAttribute, ale zamiast tego można użyć niestandardowego atrybutu lub klasy statycznej.

Semver w TeamCity powinien być dostępny używam zasilacza meta-runner. Dla Gita z git-flow (szczególnie w świecie. NET), znalazłem GitVersion jako pomocny.
 9
Author: sunside,
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
2017-07-19 09:00:06

Nie ma twardej i szybkiej reguły, jeśli chodzi o wersjonowanie zestawów, więc możesz spróbować, które kiedykolwiek zadziałałyby dla ciebie, ale sugerowałbym, abyś skorzystał z podejścia 4 części, ponieważ będziesz miał elastyczność okrywającą, że chcesz wprowadzić pewne zmiany w przyszłości.

... dla ex: 1.0.0.*

Reserved-to dodaje dodatkową elastyczność, okaż, że chcesz wprowadzić jakiekolwiek zmiany w przyszłości. Ale jako domyślne, zachowaj go jako 0.

Należy również rozważyć podpisanie Zgromadzenia z silnym klucz. Rozwiąże to problem konfliktu montażu w przypadku posiadania wielu wersji zestawu zarejestrowanych w GAC. MSDN Link

 1
Author: Karthik Mahalingam,
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
2010-10-08 20:32:13