3

我想在使用 git 的应用程序的对话框中实现构建 ID。我知道从 git 获取构建 ID 的 unix 命令,但我不知道如何在构建过程中获取它。

4

3 回答 3

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%环境变量中。

于 2013-02-08T09:55:38.950 回答
0

如果您使用的是 Nant,则必须执行一组任务才能获取 git id

在此之后,您可以执行正则表达式并获取 ID 并将其设置为属性。

于 2013-02-08T09:53:01.913 回答
0

根据max 的回答,这里有一个替代解决方案,它不创建资源,而是直接从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因为它是自动生成的。

于 2017-02-13T11:42:22.187 回答