我将配置文件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
元软件包中的所有依赖项,如下所示:不应该避免吗?一种方法是在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.X
和net45
。最初,使用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
在开发阶段很有用。