Je suis venu avec une solution qui a fonctionné presque le même que le vieux AssemblyVersion attribut avec une étoile (*) - AssemblyVersion("1.0.")*
Les valeurs pour AssemblyVersion et AssemblyFileVersion est en projet MSBuild .csproj fichier (et non pas dans AssemblyInfo.cs), des biens FileVersion (génère AssemblyFileVersionAttribute) et AssemblyVersion (génère AssemblyVersionAttribute).
Dans MSBuild processus, nous utilisons notre tâche MSBuild pour générer des numéros de version et puis on remplace les valeurs de ces FileVersion et AssemblyVersion propriétés avec les nouvelles valeurs de la tâche.
Alors d'abord, nous créons notre tâche MSBuild GetCurrentBuildVersion:
public class GetCurrentBuildVersion : Task
{
[Output]
public string Version { get; set; }
public string BaseVersion { get; set; }
public override bool Execute()
{
var originalVersion = System.Version.Parse(this.BaseVersion ?? "1.0.0");
this.Version = GetCurrentBuildVersionString(originalVersion);
return true;
}
private static string GetCurrentBuildVersionString(Version baseVersion)
{
DateTime d = DateTime.Now;
return new Version(baseVersion.Major, baseVersion.Minor,
(DateTime.Today - new DateTime(2000, 1, 1)).Days,
((int)new TimeSpan(d.Hour, d.Minute, d.Second).TotalSeconds) / 2).ToString();
}
}
Tâche classe hérite de Microsoft.Construire.Utilitaires.La tâche de la classe de Microsoft.Construire.Utilitaires.Base de package NuGet.
Il faut BaseVersion de propriété (en option) sur l'entrée et retourne la version générée dans la Version de la sortie de la propriété. La logique pour obtenir les numéros de version est identique .NET automatique de contrôle de version (numéro de Build est jours à compter depuis le 1/1/2000 et de la Révision est la moitié de secondes depuis minuit).
Pour construire cette tâche MSBuild, nous utilisons des .NET Standard 1.3 la bibliothèque de la classe , le type de projet avec cette classe.
.csproj fichier ressemble à ceci:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.3</TargetFramework>
<AssemblyName>DC.Build.Tasks</AssemblyName>
<RootNamespace>DC.Build.Tasks</RootNamespace>
<PackageId>DC.Build.Tasks</PackageId>
<AssemblyTitle>DC.Build.Tasks</AssemblyTitle>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Build.Framework" Version="15.1.1012" />
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.1.1012" />
</ItemGroup>
</Project>
Ce projet de tâches est aussi disponible sur mon GitHub holajan/DC.Construire.Tâches
Maintenant, nous avons le programme d'installation MSBuild pour utiliser cette tâche et définir FileVersion et AssemblyVersionpropriétés.
Dans .fichier csproj, il ressemble à ceci:
<Project Sdk="Microsoft.NET.Sdk">
<UsingTask TaskName="GetCurrentBuildVersion" AssemblyFile="$(MSBuildThisFileFullPath)\..\..\DC.Build.Tasks.dll" />
<PropertyGroup>
...
<AssemblyVersion>1.0.0.0</AssemblyVersion>
<FileVersion>1.0.0.0</FileVersion>
</PropertyGroup>
...
<Target Name="BeforeBuildActionsProject1" BeforeTargets="BeforeBuild">
<GetCurrentBuildVersion BaseVersion="$(FileVersion)">
<Output TaskParameter="Version" PropertyName="FileVersion" />
</GetCurrentBuildVersion>
<PropertyGroup>
<AssemblyVersion>$(FileVersion)</AssemblyVersion>
</PropertyGroup>
</Target>
</Project>
Importtant choses ici:
- Mentionné UsingTask importations GetCurrentBuildVersion tâche de DC.Build.Tasks.dll. Il suppose que ce fichier dll est situé sur le répertoire parent de votre .fichier csproj.
- Notre BeforeBuildActionsProject1 Cible que les appels de la tâche doit avoir nom unique par projet dans le cas où nous avons plusieurs projets dans la solution qui appelle GetCurrentBuildVersion tâche.
L'avantage de cette solution est qu'elle ne travaille pas seulement de s'appuie sur le serveur de build, mais aussi dans le manuel de construit à partir de la dotnet construire ou Visual Studio.