如何在.NET DLL中嵌入git提交散列?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (59)

我正在构建一个C#应用程序,使用Git作为我的版本控制。

有没有办法在构建我的应用程序时自动将最后一个提交哈希嵌入到可执行文件中?

例如,将提交散列打印到控制台看起来如下所示:

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

请注意,这必须在构建时完成,而不是运行时,因为我部署的可执行文件不会有可访问的git仓库。

有关C ++的相关问题可以在这里找到。 Per @ mattanja的请求,我发布我在我的项目中使用的git钩子脚本。设置:

  • 挂钩是linux shell脚本,放在:path_to_project \ .git \ hooks下
  • 如果您使用的是msysgit,则hooks文件夹中已经包含一些示例脚本。为了让git调用它们,从脚本名称中删除'.sample'扩展名。
  • 钩子脚本的名称与调用它们的事件相匹配。就我而言,我修改后提交合并后
  • 我的AssemblyInfo.cs文件直接在项目路径下(与.git文件夹相同)。它包含23行,我使用git生成第24行。

由于我的linux shelling有点生疏,脚本只是将AssemblyInfo.cs的前23行读入临时文件,将git hash回显到最后一行,并将文件重命名为AssemblyInfo.cs。我相信有更好的方法来做到这一点:

#!/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
提问于
用户回答回答于

我们在git中使用标签来跟踪版本。

git tag -a v13.3.1 -m "version 13.3.1"

可以通过以下方式从git获取哈希版本:

git describe --long

我们的构建过程将git散列放入AssemblyInfo.cs文件的AssemblyInformationalVersion属性中:

[assembly: AssemblyInformationalVersion("13.3.1.74-g5224f3b")]

一旦编译完成,可以在Windows资源管理器中查看版本:

也可以通过以下途径获得它:

var build = ((AssemblyInformationalVersionAttribute)Assembly
  .GetAssembly(typeof(YOURTYPE))
  .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false)[0])
  .InformationalVersion;

其中YOURTYPE是具有AssemblyInformationalVersion属性的程序集中的任何类型。

用户回答回答于

可以将version.txt文件嵌入到可执行文件中,然后从可执行文件中读取version.txt。要创建version.txt文件,请使用git describe --long

这里是步骤:

使用构建事件来调用git

  • 右键单击项目并选择属性
  • 在Build Events中,添加包含Pre-Build的事件(注意引号): “C:\ Program Files \ Git \ bin \ git.exe”描述--long>“$(ProjectDir)\ version.txt” 这将在您的项目目录中创建一个version.txt文件。

将version.txt嵌入到可执行文件中

  • 右键单击该项目并选择添加现有项目
  • 添加version.txt文件(更改文件选择器筛选器以使您可以看到所有文件)
  • 添加version.txt后,在解决方案资源管理器中右键单击它并选择属性
  • 将生成操作更改为嵌入式资源
  • 将复制更改为输出目录以始终复制
  • version.txt添加到.gitignore文件中

阅读嵌入的文本文件版本字符串

这里有一些示例代码来读取嵌入式文本文件版本字符串:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;

namespace TryGitDescribe
{
    class Program
    {
        static void Main(string[] args)
        {
            string gitVersion= String.Empty;
            using (Stream stream = Assembly.GetExecutingAssembly()
                    .GetManifestResourceStream("TryGitDescribe." + "version.txt"))
            using (StreamReader reader = new StreamReader(stream))
            {
                gitVersion= reader.ReadToEnd();
            }

            Console.WriteLine("Version: {0}", gitVersion);
            Console.WriteLine("Hit any key to continue");
            Console.ReadKey();
        }
    }
}

扫码关注云+社区