当未指定'targetFramework'属性时,Nuget不会安装依赖项

时间:2016-01-13 13:55:09

标签: c# visual-studio nuget nuget-package nuget-spec

根据nuspec reference章节“在版本2.0及更高版本中指定依赖关系”,可以在dependency元素中声明group而无需额外的targetFramework属性,这意味着这种依赖关系对所有框架都有效。所以我在.nuspec中为我的一个软件包指定了以下内容:

<dependencies>
  <group>
    <dependency id="DEPENDENCY" version="1.0.0" />
  </group>

  <group targetFramework="net40-client">
  </group>

  <group targetFramework="net45">
  </group>
</dependencies>

在我的一个项目中安装软件包后,依赖项根本就不存在。既不在项目引用中,也不在项目根目录中的packages文件夹中。但是这样做:

<dependencies>
  <group targetFramework="net40-client">
    <dependency id="DEPENDENCY" version="1.0.0" />
  </group>

  <group targetFramework="net45">
    <dependency id="DEPENDENCY" version="1.0.0" />
  </group>
</dependencies>

......它完美无瑕。

这是一个错误吗? ~~我是否可能使用空的本地声明覆盖'全局'依赖配置?~~或者我在这里误解了什么?

修改

可以声明空的依赖元素并且仍然具有“全局依赖元素”:https://github.com/dsplaisted/PCLStorage/blob/master/common/PCLStorage.nuspec

1 个答案:

答案 0 :(得分:1)

来自Nuget release documentation

  

组之间没有继承。如果是项目的目标   framework匹配组的targetFramework属性,只匹配   将安装该组中的依赖项。

这意味着如果项目使用net45net40-client或更高版本 - 将不会安装任何依赖项。

没有group属性的targetFramework元素用于安装这些框架的早期版本的依赖项(例如,net20)。

Nuget release documentation的一个很好的例子:

<dependencies> 
   <group>
      <dependency id="RouteMagic" version="1.1.0" />
   </group>

   <group targetFramework="net40">
      <dependency id="jQuery" />
      <dependency id="WebActivator" />
   </group>

   <group targetFramework="sl30">
   </group>
</dependencies>
  

请注意,组可以包含零依赖项。在上面的例子中,   如果包安装到以Silverlight为目标的项目中   3.0或更高版本,不会安装任何依赖项。如果程序包安装到面向.NET 4.0或更高版本的项目中,则为两个   将安装依赖项,jQuery和WebActivator。如果   package安装到一个针对早期版本的项目中   这两个框架,或任何其他框架,RouteMagic 1.1.0将是   安装。