如何正确构建netstandard1.0 NuGet包的依赖关系?

时间:2016-07-23 19:02:27

标签: .net nuget .net-core

我将配置文件259的PCL更新为.NET Standard 1.0,并希望相应地更新相应的NuGet包。我将包含实际DLL的文件夹从portable-net45+win8+wp8+wpa81更改为netstandard1.0,但我不太确定如何构建软件包的依赖关系

如果我使用.NET Core CLI创建一个包(dotnet pack),那么nuspec文件中的dependencies部分就是这样的:

<dependencies>
  <group targetFramework="netstandard1.0">
    <dependency id="NETStandard.Library" version="1.6.0" />
  </group>
</dependencies>

但是,当我将此软件包安装到仍使用packages.config的经典.NET 4.5或PCL项目时,此文件会被污染&#34;来自NETStandard.Library元数据包的所有依赖项,如下所示:

"polluted packages.config file containing all the dependencies from NETStandard.Library 1.6.0

  1. 不应该避免这种情况吗?一种方法是在nuspec文件as suggested by Oren Novotny on the GitHub page of NuSpec.ReferenceGenerator中创建空的依赖关系组。但是,他自己在one of his recent blog posts中不鼓励这样做。
  2. 我应该定位整个NETStandard.Library元数据包还是我真正需要的软件包? .NET Standard / .NET Core的概念是否可以在支持程序包依赖性的所有平台上轻松运行?
  3. 不幸的是,用于.NET Core / .NET Standard的NuGet包的official documentation尚未编写。

1 个答案:

答案 0 :(得分:4)

对于我维护的同时针对.NET Core和.NET 4.5的软件包,我必须解决这个问题。我使用的方法涉及你问题的两个方面:

  1. 在project.json中,在netstandard1.Xnet45之间拆分依赖关系。最初,使用NETStandard.Library元数据包来轻松定位前者。
  2. NETStandard.Library替换为我实际需要的特定包的引用。
  3. 在第一步中,我的project.json看起来像这样:

    {
       "dependencies": {
          "MyOtherLibrary": "1.0.0"
       },
       "frameworks": {
          "net45": {
             "frameworkAssemblies": {
                "System.Collections":"4.0.0.0"
             }
          },
          "netstandard1.3": {
             "dependencies": {
                "NETStandard.Library": "1.6.0"
             }
          }
       }
    }
    

    任何本身已与这两个框架兼容的依赖项都在dependencies中,而特定的.NET Core或.NET 4.5依赖项会根据需要放在各自的部分中。

    使用dotnet pack,这正是我所需要的:一个.nupkg可以安装在任一类型的项目中,只提供它对该框架所需的内容。

    在第二步中,我将NETStandard.Library替换为.NET Core实际需要的几个包:

    {
       "dependencies": {
          "MyOtherLibrary": "1.0.0"
       },
       "frameworks": {
          "net45": {
             "frameworkAssemblies": {
                "System.Collections":"4.0.0.0"
             }
          },
          "netstandard1.3": {
             "dependencies": {
                "System.Threading.Tasks": "4.0.11",
                "System.Net.Http": "4.1.0"
             }
          }
       }
    }
    

    这第二步并不是必需的,但是为两个平台生成一个具有最小依赖性的包是很好的。 NETStandard.Library在开发阶段很有用,因为您不太确定在核心API中需要使用的内容。