如何将提交哈希添加到可执行文件的详细信息

Posted

技术标签:

【中文标题】如何将提交哈希添加到可执行文件的详细信息【英文标题】:How to add commit hash to details of an executable file 【发布时间】:2021-09-29 07:04:37 【问题描述】:

我以前的一位雇主在构建可执行文件后,将当前提交的 GIT 哈希添加到可执行文件属性的“详细信息”选项卡中。

我发现here,这个命令给出了当前的提交哈希:

git rev-parse --short HEAD

但是有人知道如何将其添加到文件属性的“详细信息”选项卡中吗?

【问题讨论】:

您的目标是什么文件系统和操作系统? @JanWilamowski:我正在使用一台普通的 Windows-10 计算机(我在我的问题中添加了“Windows”作为标签)。 也许这个答案可以帮助你:***.com/a/35189989/10441671 @PeterKrebs:感谢您的快速回复,但没有使用标准 Windows 工具、命令或程序的解决方案吗? 对于已经编译的程序,看起来很困难。那是开发人员的事情,而不是用户的事情。我怀疑您可以在不使用命令行的情况下更改它。你不是自己编译程序(还是在你的公司?)。您可以更改它的构建过程。 【参考方案1】:

注意:我假设您正在开发一个 .NET 项目。还有其他方法可以在构建时为其他项目提供类似信息(例如:我发现 this question 提到了为 C++ 项目执行此操作的两种方法)

您可以在构建时为程序集设置许多属性,例如版本。

其中一个属性是:AssemblyInformationalVersionAttribute,可以是任何字符串。

(请参阅 the docs.microsoft page 的组件属性)

您可以在项目代码中设置它,例如,在.cs 文件中,您可以添加:

[assembly:AssemblyInformationalVersionAttribute("That's my version all right")]

注入提交哈希的一种方法是:

在代码中使用 targettable 字符串:
[assembly:AssemblyInformationalVersionAttribute("#GIT_COMMIT_PLACEHOLDER#")]
在您的构建脚本中,在构建之前搜索并用您的提交哈希替换该字符串

有一些工具可以将其与更完整的功能结合在一起。

例如,我听说过 Gitversion (https://gitversion.net/docs/),它集成在 Azure Devops 管道和 MSbuild 任务中,并提供了一系列选项来从 git 向您的构建添加版本信息(例如:从标签中读取版本号, 添加提交 sha 等...)

查看configuration 和version variables 页面,了解可以添加到构建中的内容。

【讨论】:

这听起来像是假设 .NET 构建的 exe 文件。 OP 似乎没有具体说明,“传统”本机 EXE 文件呢? 你是对的,我确实假设了一个 .NET 构建 :) This other question 指出了处理 C++ 项目版本信息的方法,并暗示应该在代码中提及版本信息(带有builder 知道这些信息)或在资源文件中。 奇怪:我在非 .Net 环境中看到过这种情况,但目前我在 .Net 环境中工作(我不知道这是否相关)。 您以gitversion 为例,但我没有那个工具:我有GIT bashGIT GUI。我有GitExtentions,但这只是在我的个人电脑上,我想找到一种方法,使用我目前拥有的工具。你觉得这可能吗?【参考方案2】:

这确实是一个 Windows 构建问题(很可能是特定于构建环境的)。例如,在 Xcode 中在 macOS 上执行此操作的方法会完全不同。

在 Git 方面(因为你已经用git 标记了它),要说的一件事是,与其坚持git rev-parse --short HEAD 的输出,不如坚持@ 的输出可能更明智987654325@,可能带有--tags 和/或--always 和/或--dirty 标志:

annotation=$(git describe --always --dirty)

例如。这样一来,release build 将被标记为 release tag,假设你设置好了你的发布标签。详情请见the git describe documentation。

【讨论】:

这实际上可能有效:我刚刚运行git describe --always,它给出了我正在寻找的结果,但现在我想将它嵌入到我的应用程序的程序集中。目前,我有[assembly: AssemblyVersion("1.0.0.0")],我想要类似:[assembly: AssemblyVersion("1.0.0.0-SHA")],其中SHAgit describe --always 的结果。为此,我需要启动该命令并在 oneliner 中获取结果,例如:[assembly: AssemblyVersion("1.0.0.0" + "-" + Shell.Commandline_Launcher("git describe --always"))],但是如何? 对于你的构建系统,我不知道。 我已经编辑了my other question关于这个主题。

以上是关于如何将提交哈希添加到可执行文件的详细信息的主要内容,如果未能解决你的问题,请参考以下文章

将 sqlite DB 添加到可执行 JAR 文件

源文件如何转换到可执行文件

Qt 通过管道到可执行 Linux 的双向通信

如何将使用 PyQt 制作的 python 应用程序打包到可安装文件中? [复制]

CMake 是不是将包含的标头中的所有内容编译到可执行文件中,还是仅将主类中使用的部分编译为可执行文件?

将所有库依赖项包含到可执行文件中 Linux