【问题标题】:Nuget pack for multiple frameworks用于多个框架的 Nuget 包
【发布时间】:2019-08-12 09:37:26
【问题描述】:

我正在尝试制作针对多个框架的 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 标准 2。(docs.microsoft.com/en-us/dotnet/standard/net-standard)。您还使用调试配置打包它。所以它会在nuget中收集调试的东西。你确定要这样做吗?
  • 包与 4.5.2 和标准 2.0 兼容,因此将其构建到这两件事中应该不是问题。我不想在 4.5.2 中使用这里的网络标准
  • 您是否尝试过使用构建? nuget 包“project.csproj”-build
  • 嗨!扔我两分钱:如果项目中没有任何 .NetFramework 特定代码,只需定位 .netstandard20 ,只要在消费项目中使用包引用就可以了
  • 我要解决的主要问题是我们的核心库有一些我们想在任何地方使用的 C# 类。但是该库的整个使用者集范围从 4.5.2 到 .NET Core。并且有一些泛型代码在 2.0 标准以下不受支持。所以我不能同时将它升级到 4.5.2,我不能让它成为网络标准 1.3。如果我以它们为目标,则输出都会吐出两个我可以添加到 nuget 的 DLL。我不明白如何用 nuget 打包它们。我试过用 MSBuild 做,效果很好。

标签: msbuild nuget .net-standard


【解决方案1】:

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

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

【讨论】:

  • 那么为什么在我将其更改为“netstandard2.0”时它会起作用?
  • 当您针对单个 TFM 时,它似乎可以工作,因为单 TFM SDK 项目与 nuget pack 设计的“旧式”项目非常相似,所以 nuget pack 的假设和约定碰巧起作用(旧式 csprojs 永远不能多目标,你需要多个 csprojs)。但是 PackageReferences 不会作为 NuGet 依赖项添加,这是 nuget pack 不支持的另一个示例。
  • 因为我是团队的新手,所以我决定做一点挖掘工作。失败最终是因为this block of code 试图找到编译器输出的位置,但TargetPath 仅在存在单个 TFM 时设置(当项目具有单个 TFM 时,或者当 SDK 正在编译其中一个 TFM 时)在多 TFM 项目中)。这在评估但不构建多 tfm 项目时返回 null。
  • Getting the TFM 也返回 null,但它并不是灾难性的,因为我认为 NuGet 只使用它来嵌套依赖项。如果没有 TFM,我认为 NuGet 只是将依赖项添加到 nuspec 中的所有 TFM。无论如何,重点是 nuget.exe 从未为多 tfm 项目设计/更新。有工作通过 MSBuild 目标使 NuGet 工作,因此您应该使用 msbuild 或 dotnet cli
【解决方案2】:

以 csproj SDK 样式文件中具有 nupsec xml 属性的多个框架为目标。在 csproj 中添加这个 TargetFrameworks(带有 's'):

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

Edit the manifest,将这些行添加到定义 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 get。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多