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

如果我使用.NET Core CLI创建程序包(dotnet pack),则nuspec文件中的依赖项部分如下所示:

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


但是,当我将此软件包安装到仍使用packages.config的经典.NET 4.5或PCL项目时,该文件将被“污染”,并带有NETStandard.Library元软件包中的所有依赖项,如下所示:

.net - 如何正确构造netstandard1.0 NuGet包的依赖项?-LMLPHP


不应该避免吗?一种方法是在nuspec文件as suggested by Oren Novotny on the GitHub page of NuSpec.ReferenceGenerator中创建空的依赖项组。但是,他本人在one of his recent blog posts中不鼓励这样做。
我应该针对整个NETStandard.Library元软件包还是仅针对我实际需要的软件包? .NET Standard / .NET Core的想法是否在支持您软件包依赖关系的所有平台上都可以轻松运行?


不幸的是,尚未编写具有.NET Core / .NET Standard的NuGet软件包的official documentation

最佳答案

对于我同时针对.NET Core和.NET 4.5的软件包,我不得不解决此问题。我使用的方法涉及到您的问题的两点:


在project.json中,将依赖关系拆分为netstandard1.Xnet45。最初,使用NETStandard.Library元数据包使前者的定位变得容易。
用对我实际需要的特定程序包的引用替换NETStandard.Library


第一步,我的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"
         }
      }
   }
}


第二步不是必需的,但是对于两个平台而言,生成具有最小依赖性的程序包是一件很不错的事情。当您不确定在核心API中需要使用什么内容时,NETStandard.Library在开发阶段很有用。

10-08 04:11
查看更多