Ich habe den größten Teil einiger Stunden damit verbracht, einen Weg zu finden, um Versionen in einer .NETCoreApp 1.1 (Visual Studio 2017) automatisch zu inkrementieren.
Ich weiß, dass die AssemblyInfo.cs dynamisch im Ordner erstellt wird: obj/Debug/netcoreapp1.1/
Es akzeptiert nicht die alte Methode von:
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.*")]
Wenn ich das Projekt auf Paket setze, kann ich dort Versionen festlegen, aber dies scheint verwendet zu werden, um die AssemblyInfo.cs-Datei zu erstellen.
Meine Frage ist, hat jemand herausgefunden, wie die Version in .NET Core-Projekten (oder .NETStandard-Projekten) gesteuert werden kann?
/p:
Flaggedotnet msbuild
in Ihrem Build-Skript übergeben und Version, Firma, Urheberrecht ... all diese guten Dinge festlegen.<Deterministic>False</Deterministic>
im csproj festlegen, dass es verwendet werden soll. (oder verwenden Sie eine andere MSbuild-Logik, um<VersionPrefix>
/ zu berechnen<Version>
)Antworten:
Ich habe nach einem Versionsinkrementierer für eine Net Core-App in VS2017 mit dem Konfigurationsformat csproj gesucht.
Ich fand ein Projekt namens Dotnet Bump, das für das Format project.json funktionierte, aber Schwierigkeiten hatte, eine Lösung für das Format .csproj zu finden. Der Autor des Dotnet-Bumps hat tatsächlich die Lösung für das .csproj-Format entwickelt, die als MSBump bezeichnet wird.
Es gibt ein Projekt auf GitHub dafür unter:
https://github.com/BalassaMarton/MSBump
Hier können Sie den Code und seine Verfügbarkeit auch auf Nuget sehen. Suchen Sie einfach auf Nuget nach MSBump.
quelle
Fügen Sie
<Deterministic>False</Deterministic>
innerhalb eines<PropertyGroup>
Abschnitts von .csproj hinzuDie Problemumgehung, damit AssemblyVersion * funktioniert, wird unter „Verwirrende Fehlermeldung für Platzhalter in [AssemblyVersion] auf .Net Core # 22660“ beschrieben.
Die Gründe, warum .Net Core-Entwickler deterministische Builds für vorteilhaft halten, wie in http://blog.paranoidcoding.com/2016/04/05/deterministic-builds-in-roslyn.html und Compiler beschrieben, sollten deterministisch sein: Dieselben Eingaben erzeugen dieselben Ausgaben # 372
Wenn Sie jedoch TeamCity, TFS oder ein anderes CI / CD-Tool verwenden, ist es wahrscheinlich besser, die Versionsnummer von diesen zu kontrollieren und zu erhöhen und als Parameter zu übergeben (wie in anderen Antworten vorgeschlagen), z
Paketnummer für NuGet-Pakete
quelle
Wenn Sie Visual Studio Team Services / TFS oder einen anderen CI-Erstellungsprozess verwenden, um eine integrierte Versionierung zu haben, können Sie das
Condition
Attribut von msbuild verwenden , zum Beispiel:Dadurch wird der .NET Core-Compiler angewiesen, alle in der
BUILD_BUILDNUMBER
Umgebungsvariablen enthaltenen Elemente zu verwenden, sofern diese vorhanden sind, oder darauf zurückzugreifen,0.0.1-local
wenn Sie einen Build auf Ihrem lokalen Computer ausführen.quelle
Ich habe eine Lösung gefunden, die fast genauso funktioniert wie das alte AssemblyVersion- Attribut mit star (*) - AssemblyVersion ("1.0. ") *
Die Werte für AssemblyVersion und AssemblyFileVersion befinden sich in der .csproj- Datei des MSBuild-Projekts (nicht in AssemblyInfo.cs ) als Eigenschaft FileVersion (generiert AssemblyFileVersionAttribute ) und AssemblyVersion (generiert AssemblyVersionAttribute ). Im MSBuild-Prozess verwenden wir unsere benutzerdefinierte MSBuild-Task, um Versionsnummern zu generieren, und überschreiben dann die Werte dieser FileVersion- und AssemblyVersion- Eigenschaften mit neuen Werten aus der Task.
Zuerst erstellen wir unsere benutzerdefinierte MSBuild-Aufgabe GetCurrentBuildVersion :
Die Task-Klasse erbt von der Microsoft.Build.Utilities.Task- Klasse vom Microsoft.Build.Utilities.Core NuGet-Paket. Es übernimmt die BaseVersion-Eigenschaft (optional) für die Eingabe und gibt die generierte Version in der Version-Ausgabeeigenschaft zurück. Die Logik zum Abrufen von Versionsnummern entspricht der automatischen Versionierung von .NET (Build-Nummer ist die Anzahl der Tage seit dem 1.1.2000 und Revision ist eine halbe Sekunde seit Mitternacht).
Zum Erstellen dieser MSBuild-Aufgabe verwenden wir den Projekttyp der .NET Standard 1.3-Klassenbibliothek mit dieser Klasse.
Die .csproj-Datei kann folgendermaßen aussehen:
Dieses Aufgabenprojekt ist auch in meinem GitHub holajan / DC.Build.Tasks verfügbar
Jetzt richten wir MSBuild für diese Aufgabe ein und legen die Eigenschaften FileVersion und AssemblyVersion fest . In der .csproj-Datei sieht es so aus:
Wichtige Dinge hier:
Der Vorteil dieser Lösung besteht darin, dass sie nicht nur mit Builds auf dem Build-Server funktioniert, sondern auch mit manuellen Builds aus Dotnet Build oder Visual Studio.
quelle
DateTime.UtcNow
anstelle derDateTime.Now
MethodeGetCurrentBuildVersionString()
in zu verwenden, insbesondere wenn der Code auf automatisierten Build-Maschinen ausgeführt wird. Sie können um 2 Uhr morgens oder 3 Uhr morgens ausgeführt werden, wenn Ihr Computer auf / von Sommerzeit umschaltet. MitDateTime.Now
in diesem Szenario könnten Sie rückwärts in Bezug auf die Version gehen. Zugegeben, dies ist ein Eckfall und ich gebe auch zu, dass ich wählerisch bin. :-) Außerdem verschwindet das Problem auch, wenn Sie auf allen Build-Maschinen dieselbe Zeitzone konfigurieren und sich nicht an die Sommerzeit anpassen.Sie können eine MSBuild-Eigenschaftsfunktion verwenden, um das Versionssuffix basierend auf dem aktuellen Datum festzulegen:
Dadurch wird ein Paket mit einem Namen wie dem folgenden ausgegeben : PackageName.1.0.0-pre20180807-1711.nupkg .
Weitere Details zu den MSBuild-Eigenschaftsfunktionen: https://docs.microsoft.com/en-us/visualstudio/msbuild/property-functions
Das
Version
wird nur aus der Kombination vonVersionPrefix
und gebildetVersionSuffix
, oder wennVersionSuffix
es leer istVersionPrefix
.quelle
Ich habe die obige Antwort akzeptiert, weil @Gigi (ab sofort) korrekt ist, aber ich war verärgert und habe die folgenden PowerShell-Skripte entwickelt.
Zuerst habe ich das Skript in meinem Lösungsordner (UpdateBuildVersion.ps1):
Ich habe dies zur csproj-Datei hinzugefügt:
Selbst wenn es sich um ein PreBuildEvent handelt, werden die Versionsnummern erst aktualisiert, nachdem die Datei in den Speicher geladen wurde, sodass die Versionsnummer erst beim nächsten Build wiedergegeben wird. Tatsächlich könnten Sie es in ein PostBuildEvent ändern und es hätte den gleichen Effekt.
Ich habe auch die folgenden zwei Skripte erstellt: (UpdateMinorVersion.ps1)
(UpdateMajorVersion.ps1)
quelle
dotnet build /p:AssemblyVersion=1.2.3.4
Ich antwortete: "Hat jemand herausgefunden, wie die Version in .NET Core-Projekten (oder .NETStandard-Projekten) gesteuert werden kann?" Ich fand diese Frage beim Versuch, dieses Problem im Kontext eines CI-Builds zu lösen. Ich wollte die Assembly-Version auf die CI-Build-Nummer setzen.
quelle
Diese Werte werden jetzt in der
.csproj
Datei festgelegt:Dies sind die gleichen Werte, die Sie sehen, wenn Sie in den Projekteinstellungen auf die Registerkarte Paket gehen . Ich glaube nicht, dass Sie
*
die Version automatisch inkrementieren können. Sie können jedoch einen Nachbearbeitungsschritt einführen, der die Versionen für Sie ersetzt (z. B. im Rahmen Ihrer kontinuierlichen Integration).quelle
Ich habe ein einfaches CLI - Tool CSPROJ .NET Core - Version Strings für die Einstellung hier . Sie können es mit Tools wie GitVersion für das automatische Versions-Bumping während CI-Builds kombinieren, wenn Sie danach suchen.
quelle
So aktivieren Sie die Versionierung Ihres .Net Core / .Net Whatever-Projekts basierend auf Ihrem GIT-Setup mithilfe der Tags / Description-Funktionen von GIT.
Ich habe eine Prebuild.targets.xml-Datei verwendet, die sich im Stammordner des Projekts befindet und in der csproj-Datei enthalten ist, wie:
Verwenden Sie das Tag "GenerateAssembyInfo", um die automatische Generierung von Baugruppeninformationen zu deaktivieren.
Anschließend generiert die Datei Prebuild.targets.xml eine CommonAssemblyInfo.cs-Datei, in die Sie die gewünschten Versions-Tags basierend auf Ihrer GIT-Version einfügen können
HINWEIS: Ich habe die Prebuilds.targets.xml woanders gefunden, habe mich also nicht darum gekümmert, sie zu bereinigen.)
Die Datei Prebuild.targets.xml:
BEARBEITEN: Wenn Sie mit MSBUILD erstellen, wird die
Könnte Ihnen Probleme bereiten
stattdessen
quelle
Sie können das Folgende in der csproj-Datei tun. Ich habe die Mathematik nicht herausgefunden. Ich habe das irgendwo anders im Stackoverflow gefunden. Dies funktioniert jedoch und gibt Ihnen etwas Ähnliches wie 1.0. * Für die Version.
quelle
Die Erweiterung "Automatische Versionen" für Visual Studio unterstützt jetzt die automatische Inkrementierung von .Net Core und .Net Standard in einer einfachen Benutzeroberfläche.
https://marketplace.visualstudio.com/items?itemName=PrecisionInfinity.AutomaticVersions
quelle
Wir können spezielle Parameter für verwenden
dotnet publish -- version-suffix 1.2.3
Für die Dateiversion:
Für die Version:
https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-publish?tabs=netcore21
quelle
Vielen Dank an @joelsand, der mich in die richtige Richtung gelenkt hat.
Ich musste seine Antwort leicht ändern, da ich beim Ausführen des DevOps Build die folgende Ausnahme bekam
Ich musste das $ (BUILD_BUILDNUMBER) am Ende des Abschnitts major.minor.build hinzufügen. Um die aktuelle Version zu de-duplizieren, verwende ich auch ein Versionspräfix:
quelle
Ich denke, diese Antwort von @joelsand ist die richtige Antwort zum Festlegen der Versionsnummer für den auf VSTS laufenden Dotnet-Kern
Um weitere Informationen zu dieser Antwort hinzuzufügen,
BUILD_BUILDNUMBER
ist eigentlich eine vordefinierte Variable .Es stellt sich heraus, dass es 2 Versionen der vordefinierten Variablen gibt.
Einer ist build.xxxx, der andere ist BUILD_XXXX.
Sie können nur
Environment Variable Name
in cproj verwenden.quelle
build.xxxx
am Frontend nicht zum Referenzieren innerhalb einer Pipeline verwendet undBUILD_XXXX
hat denselben Wert, jedoch mit leicht modifizierter Syntax, die zum Referenzieren der Variablen in PS erforderlich ist?