我想对使用git的应用程序对话框实现构建id。我知道unix命令从git获取构建id,但我不知道如何在构建期间获取它。
答案 0 :(得分:6)
可能最简单的方法是使用预构建事件。解决方案是调用git
命令,将输出转储到文本文件,将该文件包含为资源并使用C#代码加载资源。
使用以下内容将prebuild.cmd
添加到项目目录中:
cd %1
git log -n 1 --format=format:"%%h" HEAD > %2
转到项目属性,选项卡Build Events
并输入以下命令作为预构建事件命令行:
"$(ProjectDir)prebuild.cmd" "$(ProjectDir)" "$(ProjectDir)revision.txt"
在项目目录中创建一个空的revision.txt
文件(或运行一次构建)。将其添加到项目中并为其设置Embedded Resource
构建操作。将此文件添加到.gitignore
也是有意义的,因为它是自动生成的。
在C#项目中添加一个新的实用程序类:
public static class GitRevisionProvider
{
public static string GetHash()
{
using(var stream = Assembly.GetExecutingAssembly()
.GetManifestResourceStream(
"DEFAULT_NAMESPACE" + "." + "revision.txt"))
using(var reader = new StreamReader(stream))
{
return reader.ReadLine();
}
}
}
不要忘记将DEFAULT_NAMESPACE
替换为项目的默认命名空间(它被添加到资源名称之前,并且没有通用的方法来获取它,您将不得不对其进行硬编码)。
此解决方案假定git
环境变量中存在%PATH%
的路径。
答案 1 :(得分:0)
如果您使用Nant,则必须执行一组任务才能获得git id
之后,您可以执行正则表达式并获取ID并将其设置为属性。
答案 2 :(得分:0)
基于max's answer这里是一个替代解决方案,它不会创建资源,而是直接从prebuild.cmd
创建类文件。
使用以下内容将prebuild.cmd
添加到项目目录中:
@echo off
cd %1
for /F "delims=" %%i in ('git describe --always --dirty --tags') do set git_revision=%%i
echo public static class Git> %2
echo {>> %2
echo public static string GetRevision()>> %2
echo {>> %2
echo return "%git_revision%";>> %2
echo }>> %2
echo }>> %2
转到项目属性,选项卡Build Events
并输入以下命令作为预构建事件命令行:
"$(ProjectDir)prebuild.cmd" "$(ProjectDir)" "$(ProjectDir)Git.cs"
在项目目录中创建一个空的Git.cs
文件(或运行一次构建)并将(现有项目...)添加到项目中。同时将Git.cs
添加到.gitignore
,因为它是自动生成的。