簡體   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