J'ai trouvé une solution qui fonctionnait presque de la même manière que l'ancien attribut AssemblyVersion avec étoile (*) - AssemblyVersion ("1.0. ") *
Les valeurs pour AssemblyVersion et AssemblyFileVersion se trouvent dans le fichier .csproj du projet MSBuild (pas dans AssemblyInfo.cs ) en tant que propriété FileVersion (génère AssemblyFileVersionAttribute ) et AssemblyVersion (génère AssemblyVersionAttribute ). Dans le processus MSBuild, nous utilisons notre tâche MSBuild personnalisée pour générer les numéros de version, puis nous remplaçons les valeurs de ces FileVersion et AssemblyVersion propriétés par les nouvelles valeurs de task.
Nous créons donc d'abord notre tâche MSBuild personnalisée 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();
}
}
Hériter de la classe de tâche Microsoft.Build.Utilities.Task classe de Microsoft.Build.Utilities.Core package NuGet. Il prend la propriété BaseVersion (facultative) en entrée et renvoie la version générée dans la propriété de sortie Version. La logique pour obtenir les numéros de version est la même que celle du contrôle de version automatique .NET (le numéro de build correspond au nombre de jours depuis le 1/1/2000 et la révision est d'une demi-seconde depuis minuit).
Pour créer cette tâche MSBuild, nous utilisons le type de projet de bibliothèque de classes .NET Standard 1.3 avec cette classe.
Le fichier .csproj peut ressembler à 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âche est également disponible dans mon GitHub holajan / DC.Build.Tasks
Nous configurons maintenant MSBuild pour utiliser cette tâche et définissons les propriétés FileVersion et AssemblyVersion . Dans le fichier .csproj, cela 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>
Choses importantes ici:
- Mentioned UsingTask importe la tâche GetCurrentBuildVersion à partir de DC.Build.Tasks.dll . Il suppose que ce fichier dll se trouve sur le répertoire parent à partir de votre fichier .csproj.
- Notre cible BeforeBuildActionsProject1 qui appelle la tâche doit avoir un nom unique par projet au cas où nous aurions plus de projets dans la solution qui appelle la tâche GetCurrentBuildVersion.
L'avantage de cette solution est qu'elle fonctionne non seulement à partir de builds sur le serveur de build, mais également dans les builds manuels de dotnet build ou de Visual Studio.
/p:
drapeaudotnet msbuild
dans votre script de construction et définir la version, la société, les droits d'auteur ... toutes ces bonnes choses.