154 votes

Intégrer un hash de commit git dans une dll .Net

Je suis en train de construire une application C#, en utilisant Git comme contrôle de version.

Existe-t-il un moyen d'intégrer automatiquement le dernier hash de commit dans l'exécutable lorsque je construis mon application ?

Par exemple, l'impression du hash du commit sur la console ressemblerait à quelque chose comme :

class PrintCommitHash
{
    private String lastCommitHash = ?? // What do I put here?
    static void Main(string[] args)
    {
        // Display the version number:
        System.Console.WriteLine(lastCommitHash );
    }
}

Notez que cela doit être fait à construire temps, pas temps de fonctionnement car mon exécutable déployé n'aura pas accès au dépôt git.

Une question connexe pour C++ peut être trouvée ici .

EDIT

A la demande de @mattanja, je poste le hook git script que j'utilise dans mes projets. La configuration :

  • Les hooks sont des scripts shell linux, qui sont placés sous : chemin_vers_le_projet \.git\hooks
  • Si vous utilisez msysgit le crochets contient déjà quelques exemples de scripts. Pour que git les appelle, enlevez l'extension '.sample' du nom du scripts.
  • Les noms des scripts de crochet correspondent à l'événement qui les invoque. Dans mon cas, j'ai modifié post-commission y post-fusion .
  • Mon AssemblyInfo.cs se trouve directement sous le chemin du projet (au même niveau que le fichier .git ). Il contient 23 lignes, et j'utilise git pour générer la 24ème.

Comme mon linux-shelling est un peu rouillé, le script lit simplement les 23 premières lignes de AssemblyInfo.cs dans un fichier temporaire, ajoute le hash git à la dernière ligne, et renomme le fichier sous le nom de AssemblyInfo.cs . Je suis sûr qu'il existe de meilleures façons de procéder :

#!/bin/sh
cmt=$(git rev-list --max-count=1 HEAD)
head -23 AssemblyInfo.cs > AssemblyInfo.cs.tmp
echo [assembly: AssemblyFileVersion\(\"$cmt\"\)] >> AssemblyInfo.cs.tmp
mv AssemblyInfo.cs.tmp AssemblyInfo.cs

J'espère que cela vous aidera.

7voto

Claas Bontus Points 285

Voici une solution simple qui fonctionne dans Visual Studio 2019 et qui obtient le hash du commit git directement dans le fichier C#. Ajoutez le code C# suivant à votre solution :

namespace MyNameSpace
{

    [System.AttributeUsage(System.AttributeTargets.Assembly, Inherited = false, AllowMultiple = false)]
    sealed class GitHashAttribute : System.Attribute
    {
        public string Hash { get; }
        public GitHashAttribute(string hsh)
        {
            this.Hash = hsh;
        }
    }
    var hash = Assembly.GetEntryAssembly().GetCustomAttribute<GitHashAttribute>().Hash;
}

Variable hash va alors contenir la chaîne de caractères désirée si vous ajoutez les lignes suivantes à votre .csproj fichier.

<Target Name="SetSourceRevisionId" BeforeTargets="InitializeSourceControlInformation">
    <Exec Command="git.exe describe --long --always --dirty --exclude='*' --abbrev=40"
          ConsoleToMSBuild="True" IgnoreExitCode="False">
        <Output PropertyName="SourceRevisionId" TaskParameter="ConsoleOutput" />
    </Exec>
</Target>

<Target Name="SetHash" AfterTargets="InitializeSourceControlInformation">
  <ItemGroup>
    <AssemblyAttribute Include="MyNameSpace.GitHashAttribute">
        <_Parameter1>$(SourceRevisionId)</_Parameter1>
    </AssemblyAttribute>
  </ItemGroup>
</Target>

Assurez-vous que MyNameSpace dans les deux fichiers correspond à votre demande. Le point important ici est que le ItemGroup doit être intégré dans un Target avec des AfterTargets set.

5voto

krlzlx Points 6

C'est maintenant très facile avec Tâche de révision .NET pour MSBuild et de travailler avec Visual Studio 2019.

Il suffit d'installer le NuGet paquet Tâche non classée.NetRevisionTask puis configurez les informations que vous souhaitez dans la section AssemblyInfo.cs comme décrit dans le Documentation GitHub .

Si vous voulez seulement le hachage du dernier commit (longueur=8) :

[assembly: AssemblyInformationalVersion("1.0-{chash:8}")]

Construisez votre projet/solution et vous aurez quelque chose comme ceci :

enter image description here

3voto

Marcus Points 2012

Comme l'autre réponse mentionne déjà la partie git, une fois que vous avez le SHA, vous pouvez envisager de générer le fichier d'aide à l'écriture. AssemblyInfo.cs de votre projet dans un hook de pré-construction.

Une façon de le faire est de créer un AssemblyInfo.cs.tmpl avec un espace réservé pour votre SHA, disons $$GITSHA$$, par ex.

[assembly: AssemblyDescription("$$GITSHA$$")]

Votre crochet de préconstruction doit alors remplacer cet espace réservé et produire le fichier AssemblyInfo.cs pour que le compilateur C# le récupère.

Pour voir comment cela peut être fait en utilisant SubWCRev pour SVN, voir cette réponse . Il ne devrait pas être difficile de faire quelque chose de similaire pour git.

D'autres moyens seraient un "make stage" comme mentionné, c'est-à-dire écrire une tâche MSBuild qui fait quelque chose de similaire. Un autre moyen encore pourrait être de post-traiter la DLL d'une manière ou d'une autre (ildasm+ilasm par exemple), mais je pense que les options mentionnées ci-dessus sont probablement les plus simples.

3voto

mamuesstack Points 1059

Pour une méthode de vérification entièrement automatisée et flexible https://github.com/Fody/Stamp . Nous l'avons utilisé avec succès pour nos projets Git (ainsi que pour le programme cette version pour les projets SVN)

Mise à jour : Ceci est périmé depuis que Stamp.Fody n'est plus maintenu.

2voto

roh85 Points 31

Vous pouvez utiliser une ligne unique powershell pour mettre à jour tous les fichiers assemblyinfo avec le hash commit.

$hash = git describe --long --always;gci **/AssemblyInfo.* -recurse | foreach { $content = (gc $_) -replace "\[assembly: Guid?.*", "$&`n[assembly: AssemblyMetadata(`"commithash`", `"$hash`")]" | sc $_ }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X