Wersjonowanie oprogramowania - niestandardowe liczenie wersji, nowa wersja co każdy Release

0

Witam.
Potrzebuje nakierowania czy to możliwe w przypadku aplikacji WinForms. Potrzebuje mieć swoją numerację wersji aplikacji - ROK.MIESIĄC.AUTO -> AUTO jest zwyczajnie liczbą, która generuje się co release, ale... AUTO powinno się zerować w przypadku gdy zmieni się miesiąc.

Pierwszy raz robię jakąkolwiek wersjonowanie w swoich aplikacjach i nie bardzo wiem, czy takie wymyślanki są realne.

2

Zależy jakim narzędziem robisz release, ale chyba wszystko, co trzeba zrobić, to nadpisać wartości w AssemblyInfo.cs
Jeśli masz jakiś system CI, to on powinien mieć taką możliwość.
Jeśli robisz lokalnie, to to samo osiągniesz jakimś skryptem.

0

Najlepiej jakby to było możliwe w Visual Studio, używam 2022 Preview. Aplikacje WinForms są jeszcze .NET Framework, może to mieć jakieś znaczenie. Zmiana AssemblyInfo.cs pewnie i jest możliwa, ale chyba z kodu tego nie jestem w stanie zrobić. Da się wywołać skrypt/kod przed wykonaniem Release? Zaznaczam, że nie mówie tutaj o opcji Publish.

2

Odnosząc się do Twojej odpowiedzi na mój komentarz:
Masz w VS zdarzenia przed/po kompilacji.
https://learn.microsoft.com/en-us/visualstudio/ide/how-to-specify-build-events-csharp?view=vs-2022

1

Nie wiem co da się zrobić w samym VS. Ja mam skrypt pythona, który ustawia wersję (podmienia w AssemblyInfo nr wersji regexem), robi builda w odpowiednim typie, buduje instalator (InnoSetup) i kopiuje mi to gdzieś i na koniec clean dla tego builda.
Skrypt jako parametr dostaje typ build-a (debug, release) i inne różne rzeczy (u mnie to różne wersje dla różnych klientów - różne nazwy pliku instalatora itp).

0

No właśnie o coś takie mi chodzi głównie. Ten skrypt w Pythonie to jest już .exe i tylko uruchamiasz z odpowiednimi parametrami przekazanymi z pre-builda?

1

Nie exe, czysty python w folderze projektu.
wywołuję sobie "py ./build.py parametry..."

EDIT
skrypt uruchamia
msbuild ...,
innosetp ... itp

Ja mam tam konfigurację różnych folderów publikacji dla różnych klientów, co ma zbudować (różne aplikacje, narzędzia, ścieżki do *sln) i inne.

0

Ja pythona nie znam, ale mam system skonfigurowany pod Dart i można zrobić dart run build.dart 🤔 Powinno dać radę

1

A po co sobie komplikować?
Piszesz .net, więc zakładam, że znasz C# - czemu w nim nie napiszesz sobie skryptu (programiku) :)?

0

No niby tak, ale czy .NET nie potrzebuje całej tej swojej "otoczki" , aby się uruchomić? Wystarczy mi plik build.cs i uruchomić go dotnet run?

2

No jeśli chcemy koniecznie skrypty w C#, to https://cakebuild.net/
Jeśli niekoniecznie C#, to jest FAKE, MAKE, RAKE, i pewnie tysiąc innych AKE. :P

0

Fajne "nie komplikowanie" 😂

0

W c#
Nazwa skryptu -> buils.csx (musi być .csx)
csi .\build.csx

0
AdamWox napisał(a):

Fajne "nie komplikowanie" 😂

No jak się nie podoba gotowy system buidów, i chcesz robić przez VS, to najprościej będzie po prostu skrypt PowerShella wywoływać w pre-build evencie.

0

Możesz też napisać sobie własny Task do MSBuilda. Swego czasu robiłem coś w tym stylu -- do .csproj w kolejnych taskach było uruchamianie taska, który oblicza wersję i takiego, który podmienia AssemblyInfo.cs z szablonu na właściwy, z wygenerowanymi już wartościami wstawionymi w odpowiednie miejsca.

I to jest odpowiedni poziom przekomplikowania :P

0

Na mój łeb, to w numeracji RRMM, która przyszła od MałoMiękkiego kilka lat temu, nie tyle chodzi o date kompilacji, ile o linie (wersję) wywodzącą się z marca 2022, majacą swoje aktualziacje również w kwietniu, maju, lipcu i wrześniu.
Mają wsparcie na rynku dla wersji 22.03, przygotowywana jest wersja 22.08
Bardziej chodzi o podanie "ludzkim językiem" wersji brancha.

W takim widzeniu, automatyczne wg daty kompilacji/buildu nie zachowuje tego założenia. Kompilując w październiku 2022 branche genetycznie sięgające marca i sierpnia, nic dobrego nie uzyskujemy na zaproponowanej numeracji

Po przyzwyczajeniu się do tej numeracji*) (w rozumieniu j/w), mozna zobaczyć w tym zalety. Wywrócenie choć pozornie zachowując powierzchowność, psuje to, co było pożyteczne.

Koledzy pracowicie mielą myśli, wyznaczając zły cel.

*) buntowałem się, ale ona (ta od MS) w gruncie rzeczy też jest numeracją semantyczną - od @AdamWox nie jest.

0

Na tę chwilę podpowiedź od @jacek.placek jest najlepsza. Udało mi się to ogarnąć skryptem w Dart.

import 'dart:io';

void main(List<String> args) async {
  File file = new File(args[0] + "\\Properties\\AssemblyInfo.cs");
  String fileText = await file.readAsString();
  List<String> fileContent = await file.readAsLines();
  String token = "AssemblyVersion(\"";

  String versionLine = fileContent.firstWhere((element) => element.contains(token));
  int startIndex = versionLine.indexOf("(\"") + 2;
  int stopIndex = versionLine.indexOf("\")");

  String result = versionLine.substring(startIndex, stopIndex);
  List<String> data = result.split(".");
  String currentYear = DateTime.now().year.toString();
  String currentMonth = DateTime.now().month.toString();
  data[0] = currentYear;
  if (currentMonth != data[1]) {
    data[1] = currentMonth;
    data[2] = "1";
  } else {
    int last = int.parse(data[2]) + 1;
    data[2] = last.toString();
  }

  String newVersion = '${data[0]}.${data[1]}.${data[2]}';
  fileText = fileText.replaceFirst(result, newVersion);

  file = await file.writeAsString(fileText);
}

A w Build Events

if $(ConfigurationName) == Release dart run $(ProjectDir)build_script.dart $(ProjectDir)

1 użytkowników online, w tym zalogowanych: 0, gości: 1