创建多目标 nuget 包

create multi target nuget package

嗨,我想创建多目标 nuget 包。一切似乎都运行良好,除了当我创建 wpf NetCore3 应用程序并安装我的包时使用了 .NET Framework dll 而未使用 NetCore3 库

<files>
    <file src="lib\netcore\Control.dll" target="lib\netcore" />
    <file src="lib\net48\Control.dll" target="lib\net48" />
    <file src="lib\net40\Control.dll" target="lib\net40" />
    <file src="lib\net40\Microsoft.Windows.Shell.dll" target="lib\net40" />
  </files>

这个lib\netcore正确吗?

netcore is a Microsoft Store TFM.

对于您的 .NET Core 3 (netcoreapp3.0) WPF 应用程序,您需要在 NuGet 包中使用 netstandardnetcoreapp 进行多目标。

例如:

<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>

您应该在包中使用与 csproj<TargetFramework> 元素中相同的 TFM。如果您的 csproj<TargetFramework>netcore</TargetFramework>,那么当然可以使用 lib/netcore/whatever.dll。但是如果你的 csproj<TargetFramework>netcoreapp3.0</TargetFramework>,那么你应该使用 lib/netcoreapp3.0/whatever.dll.

但是,SDK 样式项目是唯一适用于 .NET Core 3.0 的类型,支持多目标(将 <TargetFramework> 更改为 <TargetFrameworks>,然后使用分号分隔列表 netcoreapp3.0;net48;net40), 并且 NuGet 的打包目标知道如何自动打包这些项目。因此,无需自己创建 nuspec,这样可以最大限度地降低犯此类错误的风险。

所以,就像 NuGet's docs on creating multi-targeting packages says, just use dotnet pack to create your package, and let NuGet figure out what lib/* folders to use. Avoid using nuspec files. Any other metadata you specify in the nuspec can specified via MSBuild properties in your csproj.