Estoy construyendo una aplicación C #, usando Git como mi control de versiones.
¿Hay alguna manera de incrustar automáticamente el último hash de confirmación en el ejecutable cuando construyo mi aplicación?
Por ejemplo, imprimir el hash de confirmación en la consola se vería así:
class PrintCommitHash
{
private String lastCommitHash = ?? // What do I put here?
static void Main(string[] args)
{
// Display the version number:
System.Console.WriteLine(lastCommitHash );
}
}
Tenga en cuenta que esto debe hacerse en el momento de la compilación , no en el tiempo de ejecución , ya que mi ejecutable implementado no tendrá el repositorio de git accesible.
Aquí se puede encontrar una pregunta relacionada con C ++ .
EDITAR
Por la solicitud de @ mattanja, estoy publicando el script de git hook que uso en mis proyectos. La puesta en marcha:
- Los ganchos son scripts de shell de Linux, que se colocan en: path_to_project \ .git \ hooks
- Si está utilizando msysgit , la carpeta hooks ya contiene algunos scripts de muestra. Para hacer que git los llame, elimine la extensión '.sample' del nombre del script.
- Los nombres de los scripts de gancho coinciden con el evento que los invoca. En mi caso, modifiqué post-commit y post-merge .
- Mi archivo AssemblyInfo.cs está directamente debajo de la ruta del proyecto (mismo nivel que la carpeta .git ). Contiene 23 líneas y uso git para generar el 24.
Como mi linux-shelling está un poco oxidado, el script simplemente lee las primeras 23 líneas de AssemblyInfo.cs en un archivo temporal, hace eco del hash de git en la última línea y cambia el nombre del archivo a AssemblyInfo.cs . Estoy seguro de que hay mejores formas de hacer esto:
#!/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
Espero que esto ayude.
GlobalAssemblyInfo.*
archivos en tiempo de compilación para proyectos C # y C ++: De forma predeterminada, la versión de ensamblado generada contiene: el hash de confirmación, una bandera que indica cambios locales y una Incremento contando la cantidad de confirmación desde la raíz del repositorio hasta la confirmación actual.Puede incrustar un archivo version.txt en el ejecutable y luego leer el version.txt del ejecutable. Para crear el archivo version.txt , use
git describe --long
Estos son los pasos:
Usa un evento de compilación para llamar a git
Haga clic derecho en el proyecto y seleccione Propiedades
En Build Events, agregue el evento Pre-Build que contenga (observe las comillas):
"C: \ Archivos de programa \ Git \ bin \ git.exe" describa - largo> "$ (ProjectDir) \ version.txt"
Eso creará un archivo version.txt en el directorio de su proyecto.
Incruste el version.txt en el ejecutable
Leer la cadena de versión del archivo de texto incrustado
Aquí hay un código de muestra para leer la cadena de versión del archivo de texto incrustado:
fuente
git describe --dirty
, que agrega una bandera cuando los desarrolladores están trabajando con un árbol de trabajo sucio.GetEntryAssembly
conseguir montaje. En cualquier caso, puede llamarGetName().Name
para evitar codificar el nombre.ACTUALIZAR:
Las cosas han evolucionado desde que respondí originalmente a esta pregunta. El
Microsoft.NET.Sdk
(lo que significa que debe estar usando un proyecto de estilo sdk) ahora incluye soporte para agregar el hash de confirmación tanto a la versión informativa del ensamblado como a los metadatos del paquete nuget, si se cumplen algunas condiciones:<SourceRevisionId>
propiedad debe estar definida. Esto se puede hacer agregando un objetivo como este:Este objetivo ejecuta un comando que se configurará
SourceRevisionId
como el hash abreviado (8 caracteres). BeforeTargets hace que esto se ejecute antes de que se cree la versión informativa del ensamblado.Para incluir el hash en los metadatos del paquete nuget,
<RepositoryUrl>
también se debe definir.<SourceControlInformationFeatureSupported>
debe ser la propiedadtrue
, esto hace que la tarea del paquete nuget también recoja el SourceRevisionId.Alejaría a la gente de usar el paquete MSBuildGitHash, ya que esta nueva técnica es más limpia y consistente.
ORIGINAL:
He creado un paquete nuget simple que puede incluir en su proyecto y que se encargará de esto por usted: https://www.nuget.org/packages/MSBuildGitHash/
Este paquete nuget implementa una solución MSBuild "pura". Si prefiere no depender de un paquete nuget, simplemente puede copiar estos Targets en su archivo csproj y debe incluir el hash de git como un atributo de ensamblaje personalizado:
Aquí hay dos objetivos. El primero, "GetGitHash", carga el hash de git en una propiedad de MSBuild llamada BuildHash, solo lo hace si BuildHash aún no está definido. Esto le permite pasarlo a MSBuild en la línea de comandos, si lo prefiere. Podría pasarlo a MSBuild así:
MSBuild.exe myproj.csproj /p:BuildHash=MYHASHVAL
El segundo objetivo, "WriteGitHash", escribirá el valor hash en un archivo en la carpeta temporal "obj" llamado "CustomAssemblyInfo.cs". Este archivo contendrá una línea que se parece a:
[assembly: AssemblyMetadata("GitHash", "MYHASHVAL")]
Este archivo CustomAssemblyInfo.cs se compilará en su ensamblado, por lo que puede usar la reflexión para buscar el
AssemblyMetadata
en tiempo de ejecución. El siguiente código muestra cómo se puede hacer esto cuando laAssemblyInfo
clase está incluida en el mismo ensamblado.Algunos de los beneficios de este diseño es que no toca ningún archivo en la carpeta de su proyecto, todos los archivos mutados están en la carpeta "obj". Su proyecto también se compilará de manera idéntica desde Visual Studio o desde la línea de comandos. También se puede personalizar fácilmente para su proyecto y se controlará en origen junto con su archivo csproj.
fuente
Assembly.GetExecutingAssembly()
, luego examinando el ensamblajeCustomAttributes
.GitHash
? Puedo ver que ese valor existe, pero ¿hay algún método puro para obtener un atributo personalizado por nombre? Parece que tengo que escribir una consulta larga donde seleccionarCustomAttributes
, gracias.CustomAttributes
. Por ejemplo, aquí está la función que utilizo para extraer la cadena hash: pastebin.com/nVKGLhJCOtra forma de hacer esto es usar NetRevisionTool con algo de magia de Visual Studio integrada . Mostraré esto aquí para Visual Studio 2013 Professional Edition, pero esto también funcionará con otras versiones.
Primero descargue NetRevisionTool. Incluya NetRevisionTool.exe en su PATH o lo registre en su repositorio y cree una acción previa y posterior a la compilación de Visual Studio y cambie su AssemblyInfo.cs.
Un ejemplo que agregaría su git-hash a su AssemblyInformationVersion sería el siguiente: En la configuración de su proyecto:
en AssemblyInfo.cs de su proyecto cambia / agrega la línea:
[ensamblado: AssemblyInformationalVersion ("1.1. {dmin: 2015}. {chash: 6} {!} - {branch}")]
en la captura de pantalla que se muestra, verifiqué NetRevisionTool.exe en la carpeta Externa / bin
Después de la compilación, si luego hace clic derecho en su binario y va a propiedades, entonces debería ver algo como lo siguiente:
Espero que esto ayude a alguien
fuente
Creo que vale la pena dar una respuesta completa paso a paso a esta pregunta. La estrategia aquí es ejecutar un script de PowerShell desde los eventos previos a la compilación que toma un archivo de plantilla y genera un archivo AssemblyInfo.cs con la etiqueta git + información de recuento de confirmaciones incluida.
Paso 1: cree un archivo AssemblyInfo_template.cs en la carpeta Project \ Properties, basado en su AssemblyInfo.cs original pero que contenga:
Paso 2: Cree un script de PowerShell llamado InjectGitVersion.ps1 cuya fuente es:
Paso 3: guarde el archivo InjectGitVersion.ps1 en el directorio de su solución en una carpeta BuildScripts
Paso 4: agregue la siguiente línea a los eventos previos a la construcción del proyecto
Paso 5: construye tu proyecto.
Paso 6: opcionalmente, agregue AssemblyInfo.cs a su archivo git ignore
fuente
AssemblyInfo.cs
se podría modificarAssemblyInfo.cs
en su lugar, compilar y luego restablecerAssemblyInfo.cs
a la última versión confirmada. Entonces, en el repositorio siempre habríaAssemblyInfo.cs
, con$..$
sustituidos solo para el momento de la construcción.git describe --match "v[0-9]*" --long --always --dirty
para filtrar ciertas etiquetas (las que contienen un número de versión) e indicar si el árbol de trabajo estaba limpio.$gitVersion -match '[v](.*)-(\d+)-[g](.+)$';
Ahora es muy fácil con .NET Revision Task para MSBuild y trabajar con Visual Studio 2019.
Simplemente instale el paquete NuGet Unclassified.NetRevisionTask , luego configure la información que desea en el
AssemblyInfo.cs
archivo como se describe en la documentación de GitHub .Si solo desea el hash de la última confirmación (longitud = 8):
Construya su proyecto / solución y tendrá algo como esto:
fuente
PropertyGroup
al archivo .csproj como se ve en el archivoComo la otra respuesta ya menciona el bit git, una vez que tenga el SHA, puede considerar generar el
AssemblyInfo.cs
archivo de su proyecto en un gancho de precompilación.Una forma de hacerlo es crear un
AssemblyInfo.cs.tmpl
archivo de plantilla, con un marcador de posición para su SHA en, por ejemplo, $$ GITSHA $$, por ejemploSu enlace previo a la compilación debe reemplazar este marcador de posición y generar el archivo AssemblyInfo.cs para que el compilador de C # lo recoja.
Para ver cómo se puede hacer esto usando SubWCRev para SVN, vea esta respuesta . No debería ser difícil hacer algo similar para git.
Otras formas serían una "etapa de creación" como se mencionó, es decir, escribir una tarea de MSBuild que haga algo similar. Otra forma más puede ser postprocesar la DLL de alguna manera (digamos ildasm + ilasm), pero creo que las opciones mencionadas anteriormente son probablemente las más fáciles.
fuente
Para obtener un método de pago completamente automatizado y flexible https://github.com/Fody/Stamp . Hemos utilizado esto con éxito para nuestros proyectos Git (así como esta versión para proyectos SVN)
Actualización: esto está desactualizado ya que Stamp.Fody ya no se mantiene
fuente
Puede usar un resumen de PowerShell para actualizar todos los archivos de información de ensamblaje con el hash de confirmación.
fuente
Como lo señaló @ learath2, la salida de
git rev-parse HEAD
le dará un hash simple.Si usa etiquetas en Git-repository (y usa etiquetas, ¿no es más descriptivo y legible que
git rev-parse
), la salida se puede recibir degit describe
(aunque también se usa con éxito más adelantegit checkout
)Puede llamar a rev-parse | describe en:
fuente
Estoy usando una combinación de la respuesta aceptada y una pequeña adición. Tengo instalada la extensión AutoT4 ( https://marketplace.visualstudio.com/items?itemName=BennorMcCarthy.AutoT4 ) para volver a ejecutar las plantillas antes de la compilación.
obteniendo la versión de GIT
Tengo
git -C $(ProjectDir) describe --long --always > "$(ProjectDir)git_version.txt"
en mi evento de pre-construcción en propiedades del proyecto. Agregar git_version.txt y VersionInfo.cs a .gitignore es una buena idea.incrustación de versión en metadatos
He agregado una
VersionInfo.tt
plantilla a mi proyecto:Ahora tengo mi etiqueta git + hash en "ProductVersion".
fuente
En referencia a la otra respuesta ( https://stackoverflow.com/a/44278482/4537127 ), también utilicé la
VersionInfo.tt
plantilla de texto para generarAssemblyInformationalVersion
sin AutoT4.(Al menos funciona en mi aplicación C # WPF)
El problema era que los eventos previos a la compilación se ejecutaban después de las transformaciones de la plantilla, por lo que después de la clonación, el
git_version.txt
archivo no estaba allí y la compilación falla. Después de crearlo manualmente para permitir que la transformación pasara una vez, se actualizó después de la transformación y siempre fue una confirmación por detrás .Tuve que hacer dos ajustes en el archivo .csproj (esto se aplica al menos para Visual Studio Community 2017)
1) Importe los objetivos de transformación de texto y realice transformaciones de plantilla para ejecutar en cada compilación: (Ref https://msdn.microsoft.com/en-us/library/ee847423.aspx )
y después
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
2) Realice la
git describe
ejecución antes de las transformaciones de la plantilla (de modo quegit_version.txt
esté ahí cuandoVersionInfo.tt
se transforme):.. Y el código C # para obtener el
AssemblyInformationalVersion
(Ref https://stackoverflow.com/a/7770189/4537127 ).. Y agregue los archivos generados a .gitignore
fuente
Otra forma sería generar un archivo Version.cs a partir de un paso de precompilación. Exploré esto en un pequeño proyecto de prueba de concepto que imprime su hash de confirmación actual.
El proyecto está cargado en https://github.com/sashoalm/GitCommitHashPrinter .
El código de lote que crea el archivo Version.cs es este:
fuente
Sitio
en
YOUR_PROJECT_NAME.csproj
fuente