为多个 .NET Framework 版本创建 NuGet 包

Max*_*xim 4 csproj nuget nuget-package

我正在开发一个库并希望为 .NET Framework 的多个版本创建 NuGet 包。我没有找到任何包含完整操作列表的文章。

我尝试过的第一个选项是创建一堆配置,如 Release_Net45 等。然后我编辑了 csproj 以更正每个配置的输出目录(lib/net45 等)和目标框架版本。然后我构建了每个配置。在那之后,我运行了 nuget pack 并成功创建了一个包,但有一个警告说没有添加一个 dll,因为它已经在包中......

然后我尝试编辑 csproj 以将 TargetFrameworks 元素和包元数据元素包含到与 Release 配置对应的 PropertyGroup 中。编辑后重新加载项目后,解决方案资源管理器中出现了一个名为 Dependencies 的新组。我尝试在开发人员命令提示符中使用 msbuild /t:pack /p:Configuration=Release 创建包,但它以没有包目标的错误完成。为了修复它,我添加了 NuGet.Build.Tasks.Pack 包,然后构建了该包。但是当我在配置管理器中查看它们时,我的配置突然损坏了。

我没想到为多个目标框架设置包会如此痛苦:( 这样做的正确方法是什么?是否有针对此任务的完整指南?

Mar*_*ich 6

TargetFramework/TargetFrameworks属性仅在基于SDK-项目的支持。目前,只有 .NET Standard、.NET Core 和 ASP.NET Core 项目的项目模板使用这种基于 SDK 的项目格式。因此,您可以创建一个 .NET Standard 库,然后编辑 csproj(右键单击项目 > 编辑)。

一个最小的例子是:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net45;net461</TargetFrameworks>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

请注意该Sdk属性的存在,该属性提供了许多默认值和额外的构建逻辑。您不需要在文件夹结构中指定任何 .cs 文件,并且可以使用项目的属性页来设置 NuGet 相关的属性。

在您的案例中显示依赖项节点的原因是因为 VS 2017 为 .NET 项目提供了两个不同的项目系统 - 一个在 VS 中存在很长时间的经典项目系统和一个在新项目系统模型上开发的新项目系统( CPS) 尚不支持经典项目系统的所有功能,但具有附加功能,例如新的依赖项模型、NuGet 的属性页以及在加载项目时支持编辑项目文件。要加载的项目系统的选择基于项目文件中的一个TargetFramework或其中一个的存在TargetFrameworks

  • 我终于解决了我的任务。可以在经典的 .NET Framework 中切换到新的 csproj 格式。这篇[文章](http://www.natemcmaster.com/blog/2017/03/09/vs2015-to-vs2017-upgrade/)对我帮助很大。 (2认同)