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

时间:2016-08-22 01:29:37

标签: nuget semantic-versioning dotnet-cli nuget-update

使用packages.config文件指定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没有&#39的版本上;我的应用程序更新我的应用程序到我的包源的新版本?

{
  "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从第二个项目中消耗它。下面是使用UpdateMeDependencyLib

的第二类库中的project.json
{
  "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中编译项目(不更改消费者project.json),消耗UpdateMeDependencyLib输出v1.1.0到其bin目录
    • 如果我在使用者库上强制执行包恢复,我现在会收到Nuget警告&#34;指定的NU1007依赖关系是UpdateMeDependencyLib&gt; = 1.0.0但最终使用UpdateMeDependencyLib 1.1.0&#34;

NU1007 warning

所以它看起来只是简单地使用&#34; 1.0.0&#34;在我的消费库中没有固定它,当我的NuGet源中出现新版本时它会自动更新。

2 个答案:

答案 0 :(得分:1)

您需要为ref

使用以下表示法
"UpdateMeDependencyLib": {
   "version": "1.0.0",
   "target": "package"
}

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

我能弄清楚的是,我们如何严格地将依赖关系设置为1.0.0,在这种情况下,打破构建。

答案 1 :(得分:1)

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

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

更新后您需要执行恢复包。