使用带有锁定文件的 NuGet 还原会出现“NU1004:包锁定文件与项目依赖项不一致”错误

Tec*_*cer 5 nuget

-LockMode当我将开关与命令一起使用时,出现此错误nuget restore

NU1004:包锁定文件与项目依赖项不一致,因此无法在锁定模式下运行恢复。禁用 RestoreLockedMode MSBuild 属性或传递显式 --force-evaluate 选项来运行还原以更新锁定文件。

我想要实现的是使用通配符自动升级我的 nuget 引用,但当我想从已知来源重新构建项目时使用特定版本。这篇博客文章描述了如何实现使用锁定文件启用可重复的包恢复

当我在只有一个项目的简单解决方案上使用-UseLockFile&-LockMode时,它按预期工作,当我开始向解决方案添加另一个项目时,就会出现问题。

步骤如下:

  1. 我已将包发布到 Azure DevOps 源,并列出了以下版本:
1.0.1-ci.1
1.0.1-ci.2
Run Code Online (Sandbox Code Playgroud)
  1. 我创建了一个 .Net 3.1 控制台应用程序,它使用通配符引用我的包,即<PackageReference Include="My.Package" Version="1.0.*-ci.*" />

  2. 运行该命令nuget restore -UseLockFile -ForceEvaluate会创建具有正确引用的packages.lock.json(我使用它-ForceEvaluate是为了确保它始终解析为提要上可用的最新版本),我的控制台项目的锁定文件的内容是:

1.0.1-ci.1
1.0.1-ci.2
Run Code Online (Sandbox Code Playgroud)
  1. 然后,我发布新版本的 My.Package ( 1.0.1-ci.3 ) 并运行该命令nuget restore -LockedMode,解析的版本仍然是1.0.1-ci.2,如果我随后运行,nuget restore -ForceEvaluate它将按预期解析为1.0 .1-ci.3,到目前为止一切顺利!

  2. 当我向使用相同包引用的解决方案添加类库时,即出现问题<PackageReference Include="My.Package" Version="1.0.*-ci.*" />,即当我运行restore -UseLockFile -ForceEvaluatepackages.lock.json 文件时更新以包含项目依赖项:

{
  "version": 1,
  "dependencies": {
    ".NETCoreApp,Version=v3.1": {
      "My.Package": {
        "type": "Direct",
        "requested": "[1.0.*-ci.*, )",
        "resolved": "1.0.0-ci.2",
        "contentHash": "4HQuN7LNoZT9Z+MOL/Yig79FehhXBZmi26j3VtWR9Cgz8k5irWspSQ8aasVbNkYp7AgA2XaDQdr/cnwJnPilpQ=="
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

而类库项目的lock文件内容为:

{
  "version": 1,
  "dependencies": {
    ".NETCoreApp,Version=v3.1": {
      "My.Package": {
        "type": "Direct",
        "requested": "[1.0.*-ci.*, )",
        "resolved": "1.0.0-ci.3",
        "contentHash": "4HQuN7LNoZT9Z+MOL/Yig79FehhXBZmi26j3VtWR9Cgz8k5irWspSQ8aasVbNkYp7AgA2XaDQdr/cnwJnPilpQ=="
      },
      "classlibrary1": {
        "type": "Project",
        "dependencies": {
          "My.Package": "1.0.0-ci.0"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

此后,当我尝试运行时,restore -LockMode出现前面提到的NU1004错误。

按照错误消息的建议和使用进行操作-ForceEvaluate显然会破坏我想要实现的目标,但我无法想象 NuGet 不涵盖这个相对简单的场景,所以我猜我做错了什么,有人有任何想法吗我可以尝试什么来使这项工作成功?

rbe*_*485 2

听起来您正在添加一个新的依赖项,然后nuget restore -LockedMode在没有先运行的情况下运行nuget restore -ForceEvaluate

在这种情况下,NuGet 应该做什么并不明显 - 您告诉它您只想使用锁定文件中的依赖项,但您也添加了新的依赖项。

听起来这通常会使恢复失败:

如果设置了锁定模式,恢复将获取锁定文件中列出的确切包,如果无法获取,则恢复将失败。例如,如果您在创建锁定文件后更新了项目定义的包依赖项

https://devblogs.microsoft.com/nuget/enable-repeatable-package-restores-using-a-lock-file/#why-use-a-lock-file

如果新依赖项的唯一传递依赖项已存在于锁定文件中但版本不同,那么您可能会遇到极端情况。

但一般来说,每当您添加新的依赖项时,您都需要更新锁定文件,然后您应该设置为继续运行nuget restore -LockedMode.

  • 如果你的 PATH 中没有 `nuget` 。然后你可以使用“dotnet Restore --force-evaluate” (2认同)