Nuget打包多个框架

9

我想制作一个针对多个框架的NuGet包,但是它不起作用。 csproj文件:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
   <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
   <OutputType>Library</OutputType>
   <TargetFrameworks>net452;netstandard2.0</TargetFrameworks>
   <NuGetPackageImportStamp />
 </PropertyGroup>

执行命令:

C:\Repos\Random\TestStuff\.nuget\nuget pack "C:\Repos\Random\TestStuff\TestPackaging\TestPackaging.csproj"

我收到了错误提示:

错误 NU5012:无法找到 'bin\Debug\TestPackaging\bin\Debug\'。请确认已经构建了该项目。

如果我将配置更改为:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
  <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
   <OutputType>Library</OutputType>
   <TargetFramework>netstandard2.0</TargetFramework>
   <NuGetPackageImportStamp />
 </PropertyGroup>
</Project>

一切都运行正常。我错过了什么吗?更改运行位置并没有任何影响。

编辑: 运行命令

C:\Repos\Random\TestStuff\.nuget\nuget pack "C:\Repos\Random\TestStuff\TestPackaging\TestPackaging.csproj" -build

显示不同的错误信息:

Build succeeded.
0 Warning(s)
0 Error(s)

Time Elapsed 00:00:00.50
Packing files from 
'C:\Repos\Random\TestStuff\TestPackaging\bin\Debug\TestPackaging\bin\Debug'.
Could not find a part of the path 
'C:\Repos\Random\TestStuff\TestPackaging\bin\Debug\TestPackaging\bin\Debug'.

与 nuspec 文件相同

我认为net4.5没有实现.net standard 2。(https://learn.microsoft.com/en-us/dotnet/standard/net-standard)。您还将其与调试配置一起打包。因此,它将在nuget中收集调试信息。您确定要这样做吗? - Carbosound1
该软件包与4.5.2和标准2.0兼容,因此将其构建到这两个平台上不应该成为问题。我并不打算在4.5.2中使用net standard。 - Shawnas
你尝试过使用构建吗?NuGet打包“project.csproj”-build。 - Carbosound1
嗨!只是想提供我的两分建议:如果项目中没有任何特定于 .NetFramework 的代码,只需针对 .netstandard20 进行目标设置,在消费项目中使用包引用,您就可以顺利完成。 - gciochina
我试图解决的主要问题是我们的核心库有一些C#类,我们希望在任何地方都能使用。但是该库的整个消费者范围从4.5.2到.NET Core不等。而且有一些泛型代码在2.0标准以下不受支持。因此,我不能将其升级到4.5.2,同时也不能使其成为net standard 1.3。如果我同时针对它们,则输出会分裂成两个DLL,我可以将它们添加到NuGet中。我不明白的是如何将它们打包到NuGet中。我尝试使用MSBuild进行操作,效果很好。 - Shawnas
2个回答

9

nuget.exe不支持打包PackageReference项目,而SDK项目始终是PackageReference。

您应该使用dotnet packmsbuild -t:pack进行打包。


1
那么为什么当我将它更改为“<TargetFramework>netstandard2.0</TargetFramework>”时它就能工作呢? - Shawnas
当你针对单个目标框架时,似乎它可以工作,因为单个TFM SDK项目与“旧风格”项目非常相似,因此nuget pack是为此设计的,所以nuget pack的假设和约定恰好能够工作(旧风格csprojs永远无法多目标,需要多个csprojs)。但是, PackageReferences不会作为NuGet依赖项添加,这是nuget pack不支持的另一个示例。 - zivkan
由于我是团队的新成员,所以我决定进行一些挖掘。失败的根本原因是因为这个代码块试图找到编译器输出的位置,但是TargetPath只有在有单个TFM(无论是项目有单个TFM还是SDK正在编译多个TFM项目中的一个TFM时)时才会设置。当评估而不是构建多tfm项目时,它返回null。 - zivkan
获取TFM也会返回null,但这并不是灾难性的,因为我认为NuGet只使用它来嵌套依赖项。没有TFM,NuGet只会将依赖项添加到nuspec中的所有TFM中。无论如何,重点是nuget.exe从未设计/更新为多tfm项目。虽然有关于使NuGet通过MSBuild目标工作的工作,但今后您应该使用msbuild或dotnet cli。 - zivkan

2
在csproj的SDK样式文件中,使用nupsec xml属性来针对多个框架。将以下TargetFrameworks(带有“s”)添加回csproj中:

将此TargetFrameworks(带有“s”)添加回csproj中,以便在SDK样式文件中使用nupsec xml属性来针对多个框架:

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

在定义了TargetFrameworks的ProjectGroup中,编辑清单并添加以下行:
<files>
  <file src="bin\Release\net462\TestPackaging.dll" target="lib\net452\TestPackaging.dll" />
  <file src="bin\Release\netstandard2.0\TestPackaging.dll" target="lib\netstandard2.0\TestPackaging.dll" />
</files>

构建项目,dll文件将放入其各自的目录中,nuget将使用两个目标框架的源文件构建。 "最初的回答"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接