project.json 指定 NuGet 依赖项的确切版本

Posted

技术标签:

【中文标题】project.json 指定 NuGet 依赖项的确切版本【英文标题】:project.json specify exact version of NuGet dependency 【发布时间】:2016-12-28 11:02:03 【问题描述】:

当使用packages.configfile 来指定 NuGet 依赖项时,我可以提供allowedVersions 属性来指定SemVer 字符串,该字符串定义了我希望能够更新到的版本范围。通过使用[],我目前能够有效地将我的包固定到单个版本。例如:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Common.Logging" version="3.3.0" allowedVersions="[3.3.0, 3.3.0]" />      
</packages>

现在在 .net 核心项目中,我们有 project.json 来指定 NuGet 依赖项(尽管它可能是短暂的),我如何将 NuGet 依赖项固定到一个版本,这样dotnet restore 不会将我的应用程序更新为可以从我的包源中获得新版本吗?


  "version": "1.0.0-*",
  "dependencies": 
    "NETStandard.Library": "1.6.0",
    "Newtonsoft.Json": "9.0.1" //how can i pin to 9.0.1 ??
  ,

nuget documentation 中的图 #2 仅暗示这是可能的,但没有提供执行此操作的语法。

-- 更新--

我使用两个 .net 核心类库和我的本地文件系统作为包存储库对此进行了测试。我创建了一个名为UpdateMeDependencyLib 的类库并将其打包为v1.0.0,并通过nuget 从第二个项目中使用它。下面是来自第二个类库的 project.json 消耗 UpdateMeDependencyLib


  "version": "1.0.0-*",

  "dependencies": 
    "NETStandard.Library": "1.6.0",
    "UpdateMeDependencyLib": "1.0.0"
  ,

  "frameworks": 
    "netstandard1.6": 
      "imports": "dnxcore50"
    
  

然后我将UpdateMeDependencyLib 更新到版本 1.1.0 并重新打包,因此我的本地系统上现在有一个 v1.0.0 和一个 v1.1.0 nuget 包。在创建UpdateMeDependencyLib的v1.1.0之后,我现在得到了以下经验

在 Visual Studio 中编译使用 UpdateMeDependencyLib 的项目(不更改使用者 project.json)将 v1.1.0 输出到其 bin 目录 如果我在消费者库上强制执行包还原,我现在会收到 Nuget 警告“NU1007 指定的依赖项是 UpdateMeDependencyLib >= 1.0.0 但最终是 UpdateMeDependencyLib 1.1.0”

因此,在我的消费库中使用“1.0.0”不会固定它,当我的 NuGet 源中出现新版本时,它会自动更新。

【问题讨论】:

“9.0.1”完全符合您的要求。 嗨@DannyChen 我已经为我的问题添加了更多细节。使用“9.0.1”似乎对我不起作用。 【参考方案1】:

您需要为您的 ref 使用以下符号

"UpdateMeDependencyLib": 
   "version": "1.0.0",
   "target": "package"

由于两个项目在同一个解决方案中,系统不会使用您的本地包 repo 来解决依赖关系。它直接使用项目作为参考。因为解决方案中不再存在引用 1.0.0,(并且因为 "UpdateMeDeepencyLib": "1.0.0" 表示 >= 1.0.0),它使用 Nuget 规则“最低适用版本”并通过引用 1.1.0 项目来解决依赖关系。请注意,UpdateMeDependencyLib 在依赖树中的图标不是 nuget 的。

我想不通的是,我们如何才能将依赖项严格设置为 1.0.0,并在这种情况下中断构建。

【讨论】:

我还是一头雾水。 “因为解决方案中不再存在引用 1.0.0” - 你在这里是什么意思 - 在他的 project.json 中,他引用 "UpdateMeDependencyLib": "1.0.0" - 并且 1.0.0 存在于他的本地包存储库中(1.0.0 和 1.1 .0)...那它为什么不使用它呢? @jbyrd 因为系统搜索的是项目而不是包,所以您必须强制目标:“包”【参考方案2】:

要锁定特定版本,请将版本号放在方括号内。

"UpdateMeDependencyLib": 
    "version": "[1.0.0]",
    "target": "package"

更新后您需要恢复软件包。

【讨论】:

以上是关于project.json 指定 NuGet 依赖项的确切版本的主要内容,如果未能解决你的问题,请参考以下文章

Nuget依赖项 - 如何在linux上显示NuGet的package.config依赖项树

NuGet:pack 命令不包括 nuget 依赖项

如何添加 NuGet 仅源包依赖项

在我的构建输出中包含 Nuget 依赖项?

您如何覆盖传递的 nuget 依赖项

项目结构