-LockMode当我将开关与命令一起使用时,出现此错误nuget restore。
NU1004:包锁定文件与项目依赖项不一致,因此无法在锁定模式下运行恢复。禁用 RestoreLockedMode MSBuild 属性或传递显式 --force-evaluate 选项来运行还原以更新锁定文件。
我想要实现的是使用通配符自动升级我的 nuget 引用,但当我想从已知来源重新构建项目时使用特定版本。这篇博客文章描述了如何实现使用锁定文件启用可重复的包恢复。
当我在只有一个项目的简单解决方案上使用-UseLockFile&-LockMode时,它按预期工作,当我开始向解决方案添加另一个项目时,就会出现问题。
步骤如下:
1.0.1-ci.1
1.0.1-ci.2
Run Code Online (Sandbox Code Playgroud)
我创建了一个 .Net 3.1 控制台应用程序,它使用通配符引用我的包,即<PackageReference Include="My.Package" Version="1.0.*-ci.*" />
运行该命令nuget restore -UseLockFile -ForceEvaluate会创建具有正确引用的packages.lock.json(我使用它-ForceEvaluate是为了确保它始终解析为提要上可用的最新版本),我的控制台项目的锁定文件的内容是:
1.0.1-ci.1
1.0.1-ci.2
Run Code Online (Sandbox Code Playgroud)
然后,我发布新版本的 My.Package ( 1.0.1-ci.3 ) 并运行该命令nuget restore -LockedMode,解析的版本仍然是1.0.1-ci.2,如果我随后运行,nuget restore -ForceEvaluate它将按预期解析为1.0 .1-ci.3,到目前为止一切顺利!
当我向使用相同包引用的解决方案添加类库时,即出现问题<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 不涵盖这个相对简单的场景,所以我猜我做错了什么,有人有任何想法吗我可以尝试什么来使这项工作成功?
听起来您正在添加一个新的依赖项,然后nuget restore -LockedMode在没有先运行的情况下运行nuget restore -ForceEvaluate。
在这种情况下,NuGet 应该做什么并不明显 - 您告诉它您只想使用锁定文件中的依赖项,但您也添加了新的依赖项。
听起来这通常会使恢复失败:
如果设置了锁定模式,恢复将获取锁定文件中列出的确切包,如果无法获取,则恢复将失败。例如,如果您在创建锁定文件后更新了项目定义的包依赖项
如果新依赖项的唯一传递依赖项已存在于锁定文件中但版本不同,那么您可能会遇到极端情况。
但一般来说,每当您添加新的依赖项时,您都需要更新锁定文件,然后您应该设置为继续运行nuget restore -LockedMode.