Je construis une application C #, en utilisant Git comme contrôle de version.
Existe-t-il un moyen d'intégrer automatiquement le dernier hachage de validation dans l'exécutable lorsque je construis mon application?
Par exemple, l'impression du hachage de validation sur la console ressemblerait à ceci:
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 au moment de la construction , pas au moment de l'exécution , car mon exécutable déployé n'aura pas le dépôt git accessible.
Une question connexe pour C ++ peut être trouvée ici .
EDIT
À la demande de @ mattanja, je poste le script git hook que j'utilise dans mes projets. La mise en place:
- Les hooks sont des scripts shell Linux, qui sont placés sous: path_to_project \ .git \ hooks
- Si vous utilisez msysgit , les hooks dossier contient déjà des exemples de scripts. Pour que git les appelle, supprimez l'extension '.sample' du nom du script.
- Les noms des scripts hook correspondent à l'événement qui les appelle. Dans mon cas, j'ai modifié post-commit et post-merge .
- Mon fichier AssemblyInfo.cs se trouve directement sous le chemin du projet (même niveau que le dossier .git ). Il contient 23 lignes et j'utilise git pour générer la 24e.
Comme mon shelling Linux est un peu rouillé, le script lit simplement les 23 premières lignes de AssemblyInfo.cs dans un fichier temporaire, renvoie le hachage git à la dernière ligne et renomme le fichier en AssemblyInfo.cs . Je suis sûr qu'il existe de meilleures façons de faire cela:
#!/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 t'aides.
GlobalAssemblyInfo.*
fichiers au moment de la compilation pour les projets C # et C ++: Par défaut, la version d'assembly générée contient: le hachage de validation, un indicateur signalant les modifications locales et un incrément en comptant la quantité de validation de la racine du référentiel à la validation actuelle.Vous pouvez incorporer un fichier version.txt dans l'exécutable, puis lire le fichier version.txt hors de l'exécutable. Pour créer le fichier version.txt , utilisez
git describe --long
Voici les étapes:
Utilisez un événement de construction pour appeler git
Faites un clic droit sur le projet et sélectionnez Propriétés
Dans les événements de construction, ajoutez un événement de pré-construction contenant (notez les guillemets):
"C: \ Program Files \ Git \ bin \ git.exe" describe --long> "$ (ProjectDir) \ version.txt"
Cela créera un fichier version.txt dans le répertoire de votre projet.
Incorporez le version.txt dans l'exécutable
Lire la chaîne de version du fichier texte incorporé
Voici un exemple de code pour lire la chaîne de version du fichier texte incorporé:
la source
git describe --dirty
, qui ajoute un indicateur lorsque les développeurs travaillent avec un arbre de travail sale.GetEntryAssembly
de faire de l'assemblage. Dans tous les cas, vous pouvez appelerGetName().Name
pour éviter de coder le nom en dur.METTRE À JOUR:
Les choses ont évolué depuis que j'ai initialement répondu à cette question. Le
Microsoft.NET.Sdk
(ce qui signifie que vous devez utiliser un projet de style sdk) inclut désormais la prise en charge de l'ajout du hachage de validation à la fois à la version informative de l'assembly ainsi qu'aux métadonnées du package nuget, si certaines conditions sont remplies:<SourceRevisionId>
propriété doit être définie. Cela peut être fait en ajoutant une cible comme celle-ci:Cette cible exécute une commande qui sera définie
SourceRevisionId
comme le hachage abrégé (8 caractères). BeforeTargets provoque cette exécution avant la création de la version informative de l'assembly.Pour inclure le hachage dans les métadonnées du package nuget, le
<RepositoryUrl>
doit également être défini.<SourceControlInformationFeatureSupported>
la propriété doit êtretrue
, cela oblige la tâche de pack de nugets à récupérer également le SourceRevisionId.J'éviterais les gens d'utiliser le package MSBuildGitHash, car cette nouvelle technique est plus propre et plus cohérente.
ORIGINAL:
J'ai créé un package nuget simple que vous pouvez inclure dans votre projet et qui s'en chargera pour vous: https://www.nuget.org/packages/MSBuildGitHash/
Ce package nuget implémente une solution MSBuild «pure». Si vous préférez ne pas dépendre d'un package nuget, vous pouvez simplement copier ces cibles dans votre fichier csproj et il devrait inclure le hachage git comme attribut d'assemblage personnalisé:
Il y a deux cibles ici. Le premier, "GetGitHash", charge le hachage git dans une propriété MSBuild nommée BuildHash, il ne le fait que si BuildHash n'est pas déjà défini. Cela vous permet de le transmettre à MSBuild sur la ligne de commande, si vous préférez. Vous pouvez le transmettre à 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 à:
[assembly: AssemblyMetadata("GitHash", "MYHASHVAL")]
Ce fichier CustomAssemblyInfo.cs sera compilé dans votre assembly, vous pouvez donc utiliser la réflexion pour rechercher le
AssemblyMetadata
à l'exécution. Le code suivant montre comment cela peut être effectué lorsque laAssemblyInfo
classe est incluse dans le même assembly.Certains avantages de cette conception est qu'elle ne touche aucun fichier dans votre dossier de projet, tous les fichiers mutés se trouvent dans le dossier «obj». Votre projet sera également généré 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é à la source avec votre fichier csproj.
la source
Assembly.GetExecutingAssembly()
, puis en examinant l'assemblyCustomAttributes
.GitHash
? Je peux voir que cette valeur existe mais existe-t-il une méthode pure pour obtenir un attribut personnalisé par nom? Il semble que je doive écrire une longue requête où sélectionnerCustomAttributes
, merci.CustomAttributes
. Par exemple, voici la fonction que j'utilise pour extraire la chaîne de hachage: pastebin.com/nVKGLhJCUne autre façon de procéder consiste à utiliser NetRevisionTool avec un peu de magie à bord de Visual Studio. Je vais le présenter ici pour Visual Studio 2013 Professional Edition, mais cela fonctionnera également avec d'autres versions.
Alors téléchargez d'abord NetRevisionTool. Vous incluez NetRevisionTool.exe dans votre PATH ou archivez-le dans votre référentiel et créez une action de pré-build et post-build de Visual Studio et modifiez votre AssemblyInfo.cs.
Un exemple qui ajouterait votre git-hash à votre AssemblyInformationVersion serait le suivant: Dans les paramètres de votre projet:
dans AssemblyInfo.cs de votre projet, vous modifiez / ajoutez la ligne:
[assembly: AssemblyInformationalVersion ("1.1. {dmin: 2015}. {chash: 6} {!} - {branch}")]
dans la capture d'écran affichée, j'ai vérifié dans NetRevisionTool.exe dans le dossier External / bin
Après la construction, si vous cliquez avec le bouton droit sur votre binaire et accédez aux propriétés, vous devriez voir quelque chose comme ce qui suit:
J'espère que cela aide quelqu'un là-bas
la source
Je pense que cette question vaut la peine de donner une réponse complète étape par étape. La stratégie ici consiste à exécuter un script PowerShell à partir des événements de pré-construction qui prend un fichier modèle et génère un fichier AssemblyInfo.cs avec la balise git + les informations de comptage de validation incluses.
Étape 1: créez un fichier AssemblyInfo_template.cs dans le dossier Project \ Properties, basé sur votre AssemblyInfo.cs d'origine mais contenant:
Étape 2: Créez un script PowerShell nommé InjectGitVersion.ps1 dont la source est:
Étape 3: enregistrez le fichier InjectGitVersion.ps1 dans le répertoire de votre solution dans un dossier BuildScripts
Étape 4: ajoutez la ligne suivante aux événements de pré-construction du projet
Étape 5: Créez votre projet.
Étape 6: Ajoutez éventuellement AssemblyInfo.cs à votre fichier git ignore
la source
AssemblyInfo.cs
on pourrait modifierAssemblyInfo.cs
sur place, construire, puis git réinitialiserAssemblyInfo.cs
à la dernière version validée. Donc, dans le repo, il y aurait toujoursAssemblyInfo.cs
, avec$..$
substitué uniquement pour le moment de la construction.git describe --match "v[0-9]*" --long --always --dirty
pour filtrer certaines balises (celles contenant un numéro de version) et pour indiquer si l'arbre de travail était propre.$gitVersion -match '[v](.*)-(\d+)-[g](.+)$';
C'est désormais très simple avec .NET Revision Task pour MSBuild et avec Visual Studio 2019.
Installez simplement le package NuGet Unclassified.NetRevisionTask , puis configurez les informations que vous souhaitez dans le
AssemblyInfo.cs
fichier comme décrit dans la documentation GitHub .Si vous ne voulez que le hachage du dernier commit (longueur = 8):
Construisez votre projet / solution et vous aurez quelque chose comme ceci:
la source
PropertyGroup
au fichier .csproj comme vu dans le README github.com/ygoe/NetRevisionTask/blob/master/README.mdComme l'autre réponse mentionne déjà le bit git, une fois que vous avez le SHA, vous pouvez envisager de générer le
AssemblyInfo.cs
fichier de votre projet dans un hook de pré-construction.Une façon de faire est de créer un
AssemblyInfo.cs.tmpl
fichier de modèle, avec un espace réservé pour votre SHA, disons $$ GITSHA $$, par exempleVotre hook de pré-génération doit ensuite remplacer cet espace réservé et générer 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, consultez cette réponse . Cela ne devrait pas être difficile de faire quelque chose de similaire pour git.
D'autres moyens seraient une "étape de création" comme mentionné, c'est-à-dire écrire une tâche MSBuild qui fait quelque chose de similaire. Encore une autre façon peut être de post-traiter la DLL d'une manière ou d'une autre (par exemple ildasm + ilasm), mais je pense que les options mentionnées ci-dessus sont probablement les plus simples.
la source
Pour une méthode de paiement entièrement automatisée et flexible https://github.com/Fody/Stamp . Nous l'avons utilisé avec succès pour nos projets Git (ainsi que cette version pour les projets SVN)
Mise à jour: Ceci est obsolète car Stamp.Fody n'est plus maintenu
la source
Vous pouvez utiliser un PowerShell one-liner pour mettre à jour tous les fichiers assemblyinfo avec le hachage de validation.
la source
Comme indiqué par @ Learath2, la sortie de
git rev-parse HEAD
vous donnera un hachage brut.Si vous utilisez des balises dans Git-repository (et que vous utilisez des balises, n'est-ce pas plus descriptif et lisible que
git rev-parse
), la sortie peut être reçue degit describe
(tout en étant également utilisée avec succès plus tard dansgit checkout
)Vous pouvez appeler rev-parse | describe dans:
la source
J'utilise une combinaison de la réponse acceptée et d'une petite addition. J'ai installé l'extension AutoT4 ( https://marketplace.visualstudio.com/items?itemName=BennorMcCarthy.AutoT4 ) pour réexécuter les modèles avant la construction.
obtenir la version de GIT
J'ai
git -C $(ProjectDir) describe --long --always > "$(ProjectDir)git_version.txt"
dans mon événement de pré-construction dans les propriétés du projet. Ajouter git_version.txt et VersionInfo.cs à .gitignore est une très bonne idée.intégration de la version dans les métadonnées
J'ai ajouté un
VersionInfo.tt
modèle à mon projet:Maintenant, j'ai ma balise git + hash dans "ProductVersion".
la source
En référence à l'autre réponse ( https://stackoverflow.com/a/44278482/4537127 ), j'ai également utilisé le
VersionInfo.tt
modèle de texte pour générerAssemblyInformationalVersion
sans AutoT4.(Atleast fonctionne dans mon application C # WPF)
Le problème était que les événements de pré-construction étaient exécutés après les transformations du modèle, donc après le clonage, le
git_version.txt
fichier n'était pas là et la construction échouait. Après l'avoir créé manuellement pour permettre à la transformation de passer une fois, il a été mis à jour après la transformation et il y avait toujours un commit derrière .J'ai dû faire deux ajustements au fichier .csproj (cela s'applique au moins pour Visual Studio Community 2017)
1) Importez les cibles de transformation de texte et effectuez des transformations de modèle à exécuter sur chaque build: (Réf https://msdn.microsoft.com/en-us/library/ee847423.aspx )
et après
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
2) Faites la
git describe
course avant les transformations du modèle (pour qu'ilgit_version.txt
y ait quandVersionInfo.tt
est transformé):..Et le code C # pour obtenir le
AssemblyInformationalVersion
(Ref https://stackoverflow.com/a/7770189/4537127 )..Et ajoutez les fichiers générés à .gitignore
la source
Une autre façon serait de générer un fichier Version.cs à partir d'une étape de pré-construction. J'ai exploré cela dans un petit projet de preuve de concept qui imprime son hachage de commit actuel.
Le projet est téléchargé sur https://github.com/sashoalm/GitCommitHashPrinter .
Le code de lot qui crée le fichier Version.cs est le suivant:
la source
Endroit
dans
YOUR_PROJECT_NAME.csproj
la source