如何在本地进行确定性构建(ContinuousIntegrationBuild 标志)?

Blu*_*eft 6 visual-studio nuget-package roslyn .net-standard visual-studio-2019

当我尝试使用 NuGet 包资源管理器发布我的包时,我看到以下警告:

非确定性

确定性 (dll/exe):非确定性
确保为 CI 构建启用以下属性,
并且您至少使用 2.1.300 SDK:

<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
Run Code Online (Sandbox Code Playgroud)

然而,当我是属性添加到PropertyGroup(如描述在这里),VS 2019怪胎出这么厉害,我从字面上需要按Ctrl + Alt + Delete键将其关闭。

根据此页面,属性名称为<Deterministic>,但这似乎根本没有任何作用。

那么如何让确定性构建工作呢?

Visual Studio 2019,v16.7.1
.Net SDK 3.1.401 (LTS)

Pur*_*ome 12

一个更简单的答案是不要弄乱.csproj文件(呃!)并通过命令行在 CI 脚本中执行此操作。

将/p:ContinuousIntegrationBuild=true参数添加到命令中dotnet pack。

dotnet pack 
    -c $env:CONFIGURATION 
    /p:ContinuousIntegrationBuild=true 
    -p:PackageVersion=$env:APPVEYOR_BUILD_VERSION
Run Code Online (Sandbox Code Playgroud)

(将其全部写成一行。为了便于阅读,我将其多行显示)

注意:--no-build参数不在这里。我们需要再次构建它。或者您可以在此之前将该参数添加到构建步骤中。

这是取自我使用的示例 CI 文件。因此,当我处于release模式时,我将库打包到 nuget 中并发布它。

保持文件干净并远离.csproj文件(这很难理解和维护)。


Dav*_*ors 7

我基本上只是在这篇博文中找到了答案:

\n
\n

虽然在 .NET SDK 项目中默认启用确定性构建,但还有一个额外的属性 ContinuousIntegrationBuild,可以在构建服务器上设置以标准化存储的文件路径。这些不应在本地开发期间启用,否则调试器将\xe2\x80\x99 无法找到本地源文件。

\n
\n
<PropertyGroup Condition="\'$(TF_BUILD)\' == \'true\'">\n  <ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>\n</PropertyGroup>\n
Run Code Online (Sandbox Code Playgroud)\n

  • 设置此变量对我来说没有什么区别:使用 NuGet Package Explorer 查看包时我仍然收到相同的警告。尝试始终将其设置为“true”(作为测试)以及使用“TF_BUILD”等自定义变量从命令行进行编译。 (3认同)