UPDATE :
Les choses ont évolué depuis que j'ai répondu à cette question. Le site Microsoft.NET.Sdk
(ce qui signifie que vous devez utiliser un projet de type sdk) inclut maintenant la prise en charge de l'ajout du hash de validation à la fois à la version informative de l'assemblage et aux métadonnées du paquet nuget, si certaines conditions sont remplies :
-
El <SourceRevisionId>
doit être définie. Ceci peut être fait en ajoutant une cible comme ceci :
<Target Name="SetSourceRevisionId" BeforeTargets="InitializeSourceControlInformation">
<Exec
Command="git describe --long --always --dirty --exclude=* --abbrev=8"
ConsoleToMSBuild="True"
IgnoreExitCode="False"
<Output PropertyName="SourceRevisionId" TaskParameter="ConsoleOutput"/>
</Exec>
</Target>
Cette cible exécute une commande qui va définir SourceRevisionId
pour être le hachage abrégé (8 caractères). L'option BeforeTargets fait en sorte qu'il soit exécuté avant la création de la version informative de l'assemblage.
-
Pour inclure le hachage dans les métadonnées du paquet nuget, la commande <RepositoryUrl>
doit également être défini.
-
<SourceControlInformationFeatureSupported>
La propriété doit être true
ce qui fait que la tâche d'empaquetage de nuget prend également en compte le SourceRevisionId.
Je conseillerais aux gens de ne pas utiliser le paquet MSBuildGitHash, car cette nouvelle technique est plus propre et plus cohérente.
ORIGINAL :
J'ai créé un paquet nuget simple que vous pouvez inclure dans votre projet et qui s'occupera de cela pour vous : https://www.nuget.org/packages/MSBuildGitHash/
Ce paquet nuget implémente une solution MSBuild "pure". Si vous préférez ne pas dépendre d'un paquet nuget, vous pouvez simplement copier ces cibles dans votre fichier csproj et il devrait inclure le hash git comme un attribut d'assemblage personnalisé :
<Target Name="GetGitHash" BeforeTargets="WriteGitHash" Condition="'$(BuildHash)' == ''">
<PropertyGroup>
<!-- temp file for the git version (lives in "obj" folder)-->
<VerFile>$(IntermediateOutputPath)gitver</VerFile>
</PropertyGroup>
<!-- write the hash to the temp file.-->
<Exec Command="git -C $(ProjectDir) describe --long --always --dirty > $(VerFile)" />
<!-- read the version into the GitVersion itemGroup-->
<ReadLinesFromFile File="$(VerFile)">
<Output TaskParameter="Lines" ItemName="GitVersion" />
</ReadLinesFromFile>
<!-- Set the BuildHash property to contain the GitVersion, if it wasn't already set.-->
<PropertyGroup>
<BuildHash>@(GitVersion)</BuildHash>
</PropertyGroup>
</Target>
<Target Name="WriteGitHash" BeforeTargets="CoreCompile">
<!-- names the obj/.../CustomAssemblyInfo.cs file -->
<PropertyGroup>
<CustomAssemblyInfoFile>$(IntermediateOutputPath)CustomAssemblyInfo.cs</CustomAssemblyInfoFile>
</PropertyGroup>
<!-- includes the CustomAssemblyInfo for compilation into your project -->
<ItemGroup>
<Compile Include="$(CustomAssemblyInfoFile)" />
</ItemGroup>
<!-- defines the AssemblyMetadata attribute that will be written -->
<ItemGroup>
<AssemblyAttributes Include="AssemblyMetadata">
<_Parameter1>GitHash</_Parameter1>
<_Parameter2>$(BuildHash)</_Parameter2>
</AssemblyAttributes>
</ItemGroup>
<!-- writes the attribute to the customAssemblyInfo file -->
<WriteCodeFragment Language="C#" OutputFile="$(CustomAssemblyInfoFile)" AssemblyAttributes="@(AssemblyAttributes)" />
</Target>
Il y a deux cibles ici. La première, "GetGitHash", charge le hash git dans une propriété MSBuild nommée BuildHash, elle uniquement fait cela si BuildHash n'est pas déjà défini. Cela vous permet de le passer à MSBuild sur la ligne de commande, si vous préférez. Vous pouvez le passer à MSBuild comme ceci :
MSBuild.exe myproj.csproj /p:BuildHash=MYHASHVAL
La deuxième cible, "WriteGitHash", écrira la valeur de hachage dans un fichier du dossier temporaire "obj" nommé "CustomAssemblyInfo.cs". Ce fichier contiendra une ligne qui ressemble à ceci :
[assembly: AssemblyMetadata("GitHash", "MYHASHVAL")]
Ce fichier CustomAssemblyInfo.cs sera compilé dans votre assemblage, de sorte que vous pouvez utiliser la réflexion pour rechercher le fichier AssemblyMetadata
au moment de l'exécution. Le code suivant montre comment cela peut être fait lorsque la fonction AssemblyInfo
est incluse dans le même assemblage.
using System.Linq;
using System.Reflection;
public static class AssemblyInfo
{
/// <summary> Gets the git hash value from the assembly
/// or null if it cannot be found. </summary>
public static string GetGitHash()
{
var asm = typeof(AssemblyInfo).Assembly;
var attrs = asm.GetCustomAttributes<AssemblyMetadataAttribute>();
return attrs.FirstOrDefault(a => a.Key == "GitHash")?.Value;
}
}
Les avantages de cette conception sont qu'elle ne touche aucun fichier dans le dossier de votre projet, tous les fichiers mutés se trouvent dans le dossier "obj". Votre projet sera également construit de manière identique à partir de Visual Studio ou de la ligne de commande. Il peut également être facilement personnalisé pour votre projet, et sera contrôlé par la source avec votre fichier csproj.