繁体   English   中英

如何为 nuget 包构建具有多个 .net 框架的项目

[英]How can I build a project with multiple .net frameworks for nuget package

我正在 github 上开发一个项目并发布到 nuget。 当我创建每个版本时,我必须构建多个 .net 框架并将这些 dll 用于 nuget 包。 有没有一种简单的方法来发布所有这些 .net 框架版本? 谢谢你。

  1. 目标框架名称 (TFM) 兼容性

存在 TFM 兼容性。 通常,较低版本的 TFM 系列与较高版本兼容。 因此,.NET Framework 4.7 程序集可用于面向 .NET Framework 4.7.1、4.7.2 或 4.8 的项目。 同样,面向 .NET Standard 1.2 的 NuGet 包可用于面向 .NET Standard 2.0 的项目。

.NET Standard 也很特别。 它不是运行时,而是运行时实现的规范。 就像.NET Standard 上的文档所说,虽然 .NET 4.6.1 被标记为与 .NET Standard 2.0 及以下版本兼容,但还是存在问题,因此建议至少使用 .NET Framework 4.7.2 或 4.8 正在使用的包或项目引用,目标是 .NET Standard。

最后,.NET Core 的运行时、 netcoreapp和 .NET Framework 之间的 API 有很大的重叠。 因此,即使存在不兼容性,为了允许 .NET Core 应用程序使用可能不兼容的 NuGet 包,.NET Core SDK 2.0 引入了一个称为目标回退的概念。 如果项目与包不直接兼容,如果包支持目标回退 TFM 之一,NuGet 将允许它,并显示警告。 它可能会在运行时失败,因此会发出警告,但它可能会起作用。 这对于 .NET Core 3.0 更为重要,开发人员在 WPF 和 WinForms 中编写桌面应用程序,希望使用提供桌面功能的 .NET Framework NuGet 包。

总之,您可能不需要创建面向多个 TFM 的 NuGet 包。 只需选择具有您需要的 API 的最低 TFM,将其作为目标,然后让 TFM 兼容性使其发挥作用。 但是,如果您想使用仅在较新的 TFM 中可用的 API,同时仍支持较旧的 TFM,那么您将需要多目标您的项目和包,但同样,您可以最大限度地减少您需要支持的 TFM 数量。 您的软件包不需要netstandard1.0netstandard1.1netstandard1.2netstandard1.3netstandard2.0netstandard2.1 TFM。

  1. 使用 SDK 风格的项目

假设您使用 Visual Studio 进行开发,请安装 .NET Core 工作负载,即使您不打算进行跨平台(Linux、Mac)开发。 使用 .NET Core,项目文件变得更加简单,同时功能更加强大,包括针对单个项目文件中的多个 TFM 的内置支持。 以前,您需要在包中为每个所需的 TFM 创建一个csproj ,编译每个项目,然后使用nuspec将所有内容放入正确的位置。 现在,简单地有一个csproj列出您想要定位的所有 TFM,并运行dotnet pack (不要创建 nuspec, 包元数据来自 MSBuild 属性)。

因此,一旦安装了 .NET Core SDK,就可以从 Visual Studio 创建一个 .NET Standard 类库,或者在命令行上运行dotnet new classlib 如果您想以 .NET Framework 为目标,创建 .NET Standard 类库并不重要,因为这就是您获得 SDK 样式项目的方式。 .NET Framework 类库项目模板使用不支持多目标的非 SDK 样式项目。 然后编辑csproj并将<TargetFramework>netstandard2.0</TargetFramework>更改为<TargetFrameworks>net472;netstandard2.0</TargetFrameworks> 请注意, TargetFramework (单数)变成了TargetFrameworks (复数),并且 XML 元素的内容是以分号分隔的您希望项目定位TFM列表)。

这是一个完整的csproj示例,您可以从它开始:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net472;netstandard2.0</TargetFrameworks>
    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
  </PropertyGroup>

</Project>

如前所述,一旦你有一个看起来像这样的csproj ,只需从命令行运行dotnet pack (你也可以在 Visual Studio 的解决方案资源管理器中右键单击该项目,然后选择 Pack),你会得到一个nupkg net472netstandard2.0编译的程序集都位于包中的正确位置。

您将以下代码用于多个 .net 框架,例如 .Net Core 3.1 或更高版本:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFrameworks>netstandard2.0;netcoreapp3.1</TargetFrameworks>
        <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
      </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.7" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.7">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\OnlineShoppingCart\OnlineShoppingCart.csproj" />
  </ItemGroup>

</Project>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM