【译】在 Linux 上不安装 Mono 构建 .NET Framework 类库
在這篇文章中,我展示了如何在 Linux 上構建針對 .NET Framework 版本的.NET項目,而不使用 Mono。通用使用微軟新發布的?Mocrosoft.NETFramework.ReferenceAssemblies?NuGet 包,您將不需要安裝除 .NET Core SDK 之外的任何其他軟件包!總的來說,在 Linux 系統上構建 .NET Framework 類庫時,只需要在你的項目文件中添加下面的節點即可:
背景:在 Linux 上構建 full-framework 類庫
如果您正在構建 .NET Standard NuGet 軟件包,并且希望為用戶提供最佳體驗(并避免一些依賴性),那么您將需要查看有關跨平臺定位的建議。那里有很多可以做和不可以做的建議,但我傾向于將其歸結為:如果您的目標是任何版本的 .NET Standard,那么您至少需要以下目標框架:
如果您的目標是.NET Standard 1.x,那么將其添加到構建目標中時,重要的是包含兩個 .NET Framework 目標以避免 .NET Standard 2.0 墊片出現問題。
這就引出了一些問題 - 完整的 .NET 框架目標理論上只能在 Windows 上構建。在上一篇文章中,我展示了如何通過安裝 Mono 并使用它提供的程序集來解決這個問題。在那篇文章中,我也展示了在 Linux 上運行 .NET Framework 測試套件。到目前為止,這對我來說非常有效,但它有幾個缺點:
它需要你安裝 Mono
它需要添加一個有點hacky .props文件
它沒有得到官方的支持,所以如果它不起作用,你就得自己想辦法
.props?文件將?FrameworkPathOverride?MSBuild 變量設置為 Mono 引用程序集,這是我們能夠構建的方式。但正如?Jon Skeet在評論中指出的那樣,Mono 實際上并不是必需的。我們只需要一種方法來輕松獲取要編譯的引用程序集。那就是微軟提供的?Microsoft.NETFramework.ReferenceAssemblies?包。
通過 NuGet 使用程序集?Microsoft.NETFramework.ReferenceAssemblies
在我看到?Muhammad Rehan Saeed?的這條推文之前,我完全沒有注意到?Microsoft.NETFramework.ReferenceAssemblies?NuGet 包。這是一條非常棒的信息,構建 full .NET Framework 類庫只需要在 Linux 上安裝 .NET Core SDK !
我們來舉個例子吧。
您可以使用??dotnet new classlib? 創建一個 .NET Core 類庫,它將提供一個如下所示的 .csproj 文件:
?修改 .csproj 項目文件,添加更多的構建目標:
?如果此時嘗試在 Linux 上使用 ?dotnet build?,您將看到類似以下內容的錯誤:
?終于到了見證奇跡的時刻。添加 Microsoft.NETFramework.ReferenceAssemblies NuGet 包到你的項目文件:
?再次執行 ?dotnet build?,竟然構建成功了。
使用?PrivateAssets?特性可防止 Microsoft.NETFramework.ReferenceAssemblies 包“泄漏”到依賴項目或已發布的 NuGet 包中;它只是一個構建時依賴。
只需將軟件包添加到項目中就可以獲得比安裝 Mono 更好的體驗。最重要的是,這將是從現在開始 .NET Core 支持的方法。并且在 .NET Core 3.0 SDK 中它將變得更好,必要時 .NET Core SDK 將自動引用此包,所以,理論上根本不需要我們手工編輯項目文件添加配置節點去構建 .NET Framework 項目!
它是如何工作的:a meta-package, a .targets, and lots of dlls
如果你對包的工作方式感興趣,我建議你閱讀相關的問題,但我會在這里提供一個高級的大綱。
我們將從?Microsoft.NETFramework.ReferenceAssemblies?NuGet 包本身開始。這個包是一個不包含代碼的元包,但是對于每個受支持的 .NET Framework 版本都依賴于不同的 NuGet 包:
例如:以 .NET Framework 4.6.1 為目標時將依賴?Microsoft.NETFramework.ReferenceAssemblies.net461。此方法可以確保您只會下載到與目標框架一致的 NuGet 包。
如果你打開一個特定 Framework 的 NuGet 包,你會在 build 文件夾中發現兩件事:
一個 .targets 文件
一個 .NETFramework 文件夾,其中包含引用的全部程序集(> 100MB)
.targets?文件與我上一篇文章中的?.props?文件的用途類似 - 它告訴 MSBuild 在哪里可以找到框架庫。以下示例來自.NET 4.6.1包:?
?這會將?TargetFrameworkRootPath?參數設置為包含?.targets?文件的文件夾。MSBuild 遍歷 NuGet 包的文件夾結構(.NETFramework \ v4.6.1),找到dll,并找到引用程序集:?
我已經使用.NET Core 2.1 SDK 和 2.2 SDK 測試了這些軟件包,并且它的工作時間都非常出色。試試看!
Reference
GitHub Issue: Build for desktop framework on non-windows platforms
PR for the Microsoft.NETFramework.ReferenceAssemblies package design
Blog post: Building .NET Framework ASP.NET Core apps on Linux using Mono and the .NET CLI
Example of replacing approach from previous post to use approach in this post
原文鏈接:https://andrewlock.net/using-reference-assemblies-to-build-net-framework-libararies-on-linux-without-mono/?
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的【译】在 Linux 上不安装 Mono 构建 .NET Framework 类库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 02 | 健康之路 kubernetes
- 下一篇: 面对人性,有的选择向左,有的向右