Wprowadzenie
Wersjonowanie paczek i serwisów to element bardzo często pomijany i ignorowany – niestety, ponieważ trzymając się różnych konwencji, można uniknąć wielu problemów. Poprawne wersjonowanie wymaga od nas pewnego wysiłku, ale wydaje mi się, że wciąż warto się go trzymać (a przynajmniej próbować!).
Trzymając się zasad SemVer, warto stosować wersjonowanie w formacie MAJOR.MINOR.PATCH, gdzie:|
PATCH – poprawki błędów (bug fixy), również kompatybilne wstecznie.
MAJOR – zmiany niekompatybilne wstecz,
MINOR – nowe funkcjonalności oraz zmiany kompatybilne wstecz,
Na pierwszy rzut oka wygląda to prosto (i tak jest) – wszystko sprowadza się do przyzwyczajenia i utrzymywania dobrych praktyk.
Kolejnym problematycznym aspektem jest aktualizowanie paczek. Czasami się o tym nie myśli, innym razem gonią terminy i brakuje na to czasu. W efekcie wpada się w spiralę – czasu nigdy nie ma, a niektóre serwisy są rzadko odwiedzane, przez co stopniowo odzwyczajamy się od regularnego podnoszenia paczek. Kończy się to tym, że każda próba aktualizacji jakiejkolwiek paczki skutkuje listą błędów, które trzeba naprawić – a oczywiście nadal nie ma na to czasu.
Na koniec ktoś w końcu musi założyć strój szambonurka i to ogarnąć. Zakładając, że większość paczek trzyma się zasad SemVer, jesteśmy w stanie odpowiednio spriorytetyzować pracę. Jeśli stan jest fatalny i mamy do nadrobienia kilka wersji MAJOR w górę, niewiele może pomóc – ale posprzątanie bałaganu zawsze daje satysfakcję (przynajmniej mnie!).
NuGet package – zakresy wersji
Sposób, w jaki wersje paczek są przechowywane w pliku .csproj, pozwala na pewną automatyzację. Osobiście nie jestem przekonany do każdej z poniższych opcji, ale jak zawsze uważam, że warto znać dostępne narzędzia i możliwości – kto wie, może kiedyś się to przyda.
W standardowym zapisie podajemy po prostu wersję, która zostanie pobrana, np. Version=”8.0.0″. Gdy pojawi się nowsza wersja, NuGet Package Manager nas o tym poinformuje, umożliwiając aktualizację.
Korzystając z zapisu Version=”[8.0.0]”, „blokujemy” wersję 8.0.0, co oznacza, że nie będzie możliwa aktualizacja do wyższej wersji. Jest to przydatne, gdy wiemy, że nie chcemy pobierać wersji nowszych niż określona.
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" /> <!-- Konkretna wersja -->
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[8.0.0]" /> <!-- Nie większa niż -->
</ItemGroup>
Możemy również podawać niepełną wersję, co pozwala na automatyczne dopasowanie zależności.
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1" /> <!-- Najniższa wersja np. 3.1.0 -->
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.*" /> <!-- Najwyższa wersja np. 3.1.32 -->
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="(3.1.12,)" /> <!-- Najniższa wersja, wyższa niż 3.1.12 - 3.1.13 -->
</ItemGroup>
Takie podejście może być pomocne, gdy chcemy zachować elastyczność aktualizacji, ale wymaga ostrożności, aby uniknąć nieoczekiwanych zmian.