Git 提交哈希影响新格式 csproj 的 Visual Studio dll/exe 二进制文件

问题描述

我有很多 NET Framework 项目。旧项目具有旧的 csproj 格式,Deterministic=true。因此,每当我构建程序集时,我都会收到二进制相同的输出文件(dll 或 exe)。新项目具有新的 csproj 格式。在新格式中,没有确定性选项。最奇怪的是,当前的 checkout git hash 会影响输出的二进制文件。所以我只收到相同的 git commit 的相同二进制文件。但是,如果我更改不影响项目的内容并构建它,我会得到不同的二进制文件

最简单的复现方式:

  1. 构建项目
  2. 通过 git commit --ammend -m "Some message" 将 git commit 消息更改为任何其他(甚至相同)
  3. 构建项目
  4. 比较二进制文件(它们不同)

如果项目是相同的,无论它是从哪个 git commit 构建的(与旧的 csproj 格式相同),我都希望我的二进制文件是相同的。我怎样才能做到这一点?

解决方法

事实证明,引用的项目之一(我们称之为“SomeProject”)使用 Nerdbank.GitVersioning 来生成文件版本。这就是为什么所有依赖于“SomeProject”二进制文件的项目在构建时都会发生变化。