NuGet 锁定文件无法使用 --locked-mode 还原

Posted

技术标签:

【中文标题】NuGet 锁定文件无法使用 --locked-mode 还原【英文标题】:NuGet lock file fails to restore with --locked-mode 【发布时间】:2019-12-01 08:15:19 【问题描述】:

Roslyn 几年前给了我们deterministic builds。

加上NuGet lock files,我们终于可以保证可重现的构建

我是 looking at the docs,表示我可以选择加入

--use-lock-file Bootstraps use of lock file for a project. You can alternatively set RestorePackagesWithLockFile property in the project file

并且在恢复时需要一个锁定文件:

--locked-mode Enables locked mode for restore. This is useful in CI/CD scenarios where you would like to get the repeatable builds. This can be also by setting the RestoreLockedMode MSBuild property to true

我正在尝试修改回购根目录下的Directory.Build.props

   <PropertyGroup>
     ...
+    <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
   </PropertyGroup>

当我运行dotnet restore 时,我看到生成了lock 文件:

    benchmarks/Sentry.Benchmarks/packages.lock.json
    samples/Sentry.Samples.AspNetCore.Basic/packages.lock.json
    ...
    test/Sentry.Tests/packages.lock.json

现在如果我尝试恢复:dotnet restore --locked-mode,它会完全失败。输出的摘要是:

/Users/bruno/git/sentry-dotnet/test/Sentry.Tests/Sentry.Tests.csproj : error NU1603: System.Private.DataContractSerialization 4.1.1 depends on System.Xml.XmlDocument (>= 4.0.1) but System.Xml.XmlDocument 4.0.1 was not found. An approximate best match of System.Xml.XmlDocument 4.3.0 was resolved. [/Users/bruno/git/sentry-dotnet/Sentry.sln]
/Users/bruno/git/sentry-dotnet/test/Sentry.Tests/Sentry.Tests.csproj : error NU1603: System.Xml.XPath.XmlDocument 4.0.1 depends on System.Xml.XmlDocument (>= 4.0.1) but System.Xml.XmlDocument 4.0.1 was not found. An approximate best match of System.Xml.XmlDocument 4.3.0 was resolved. [/Users/bruno/git/sentry-dotnet/Sentry.sln]
  Restore failed in 383.47 ms for /Users/bruno/git/sentry-dotnet/test/Sentry.NLog.Tests/Sentry.NLog.Tests.csproj.
  Restore failed in 370.7 ms for /Users/bruno/git/sentry-dotnet/test/Sentry.Testing/Sentry.Testing.csproj.

我一定是搞错了。

PS:我已将更改推送到分支和opened a PR on GitHub,如果有兴趣查看。

编辑:2021 年 1 月:1 年半后,我再次尝试使用 .NET 5 SDK,但仍然遇到问题: https://github.com/getsentry/sentry-dotnet/pull/731

我试过DisableImplicitNuGetFallbackFolder 没有成功。锁定文件似乎是平台相关的。

在 CI 中,它在 macOSLinux 上正常工作,但在 Windows 上失败。我在 Mac 上创建了锁定文件。我在 Windows 上拉了分支,它确实失败了:

error NU1403: Package content hash validation failed for System.Net.Http.4.3.0. The package is different than the last restore.

我敢打赌它在计算哈希时使用了文件路径分隔符,例如 /,这就是失败的原因。

【问题讨论】:

嗨,这有什么更新吗?我遇到了完全相同的问题。 【参考方案1】:

通过将RuntimeIdentifiers 添加到您的PropertyGroup 应该可以实现跨平台稳定锁定文件,例如&lt;RuntimeIdentifiers&gt;win-x64;linux-x64;osx-x64&lt;/RuntimeIdentifiers&gt;

【讨论】:

以上是关于NuGet 锁定文件无法使用 --locked-mode 还原的主要内容,如果未能解决你的问题,请参考以下文章

卡住不活动的 msbuild.exe 进程、锁定 Stylecop.dll、Nuget AccessViolationException 和 CI 构建相互冲突的奥秘

无法使用 Azure.Storage.Blobs NuGet 包将文件上传到 Azure Blob 存储

无法安装 NuGet 包:回退到 NuGet 本地缓存 [重复]

Visual Studio 无法识别已安装 NuGet 包的头文件

源链接无法从私有 azure 符号服务器下载 nuget 的源文件,使用了错误的域 dev.azure.com/raw/

Photoshop Extendscript - 文件被锁定 - 无法保存