【发布时间】:2021-12-10 14:56:14
【问题描述】:
我需要在 git 中包含一些 DLL 文件。我知道这不是一个好习惯。但这个解决方案暂时解决了我们的一个问题。
但问题是,虽然我根本没有改变任何东西,也没有修改任何一行代码,甚至没有修改一个字符,但当我使用 dotnet build 时,我看到 git 将输出标记为 修改。
我尝试使用 Beyond Compare 的十六进制比较来比较它们,这是开始字节的图像:
我不知道为什么要修改它。我的意思是,我希望 dotnet build 具有确定性,并且对于相同的输入给我相同的结果。但显然有些事情发生了变化。
有人知道dotnet build为什么会有这种行为吗?
我正在使用 .NET 6。
【问题讨论】:
-
我的猜测:它包括构建二进制文件的时间的时间戳。除非您有时光机,否则每次都应该不同。另请参阅this 以供参考
-
你可能想看看reproducible builds
-
@FranzGleichmann 是正确的,时间戳存储在构建程序集的 PE Header 中。
-
Roslyn 支持deterministic builds
-
@KlausGütter:感谢您的链接。 .NET 编译器生成的 PE 文件的不确定性一直是个问题。我知道微软在很久以前就生产了一个工具,它可以对两个 PE 文件进行二进制比较,排除每次构建时更改的位。这在一些受监管的行业中是必不可少的。据我所知,它从未被广泛使用(您需要一份 Premier Support 合同和一个好奇的 TAM 或 ADC 才能获得访问权限)。很高兴知道这一点。谢谢!