簡體   English   中英

如何在VS 2017中創建具有最小依賴性的.NET Standard NuGet包?

[英]How to create .NET Standard NuGet package with minimal dependencies in VS 2017?

我目前正在使用Visual Studio 2017遷移庫項目以支持.NET Standard 1.1。

我希望將該項目作為單個NuGet包發布,該包可以同時針對.NET Framework 4.5+和.NET Core,UWP等。

但是,當我嘗試在.NET Framework項目中安裝生成的包時,會生成一個包含.NET標准中定義的所有包的大量包依賴關系(見下文):

在.NET 4.5項目上安裝后的程序包依賴關系。

據我所知,這些都是作為.NET Standard 1.1規范的一部分定義的程序集。 但是,我的特定項目實際上只需要它們中的一小部分,並且對於在項目中安裝包的任何人來說,這種依賴性列表將非常混亂。

我試圖按照類似問題的答案,其中建議是更改項目規范以僅引用項目所需的確切依賴項。

但是,答案是在舊的project.json格式的上下文中,現在已經被VS 2017中的新.csproj格式所取代。我試圖通過刪除<TargetFramework>來刪除對.NET Standard 1.1元數據包的依賴性。指令,但我只是設法破壞了構建,無法找到任何方法專門添加所需的依賴項。

將庫遷移到.NET Standard以實現最大平台兼容性的承諾極具吸引力,但建議依賴性的方法是什么,以便針對“經典”.NET Framework的項目找不到所有這些依賴項“污染”的項目?

<TargetFramework>更改為<TargetFrameworks>並添加;net45 您仍然可以獲得單個NuGet包輸出,但現在如果您的目標是.NET核心應用程序(已經具有依賴項),它將只會引入額外的依賴項。

首先,我想指出 ,這主要是設計時的問題,不影響所產生的應用程序和庫的可移植性:

在過去,我們已經給開發人員建議不要從NuGet包中引用元包( NETStandard.Library ),而是引用單個包,如System.RuntimeSystem.Collections 理由是我們認為元包是一堆軟件包的簡寫,這些軟件包是.NET平台的實際原子構建塊。 假設是:我們可能最終創建另一個.NET平台,它只支持其中一些原子塊,但不支持所有這些原子塊。 關於我們的工具如何處理大包圖也存在顧慮。

展望未來,我們將簡化這一點:

  1. .NET Standard是一個原子構建塊 換句話說,新平台不允許使用.NET Standard - 他們必須實現所有這些。

  2. 我們正在逐漸不使用包來描述我們的平台 ,包括.NET Standard。

這意味着,您不必再為.NET Standard引用任何NuGet包。 您表達了對lib文件夾的依賴關系,這正是它對所有其他.NET平台,特別是.NET Framework的工作方式。

但是,現在我們的工具仍然會在對NETStandard.Library的引用中NETStandard.Library 這也沒有任何害處,它將變得多余的向前發展。

但是,我完全承認這一結果幾乎不可取。

使用.NET Standard 1.x和packages.config ,您不得不選擇生成帶有自定義依賴關系組的手寫.nuspec。 但是,這需要了解哪些包是必需的並且往往是脆弱的。 如果消費者使用<PackageReference>它稍微不那么令人頭疼,因為它將直接參考文獻與傳遞參考文獻分開,因此這些並不是你臉上的那么多。

使用.NET Standard 2.0,問題將完全消失。

如果你查看net45的那些包引用,你會發現沒有實際的DLL加載。 包就在那里,運行時如coreclr加載BCL的所有部分就像dll一樣可以得到它們。 但是在net45中,你實際上並沒有在這些包中找到任何dll。

簡而言之,在.net 4.x中,.net仍將使用GAC來加載這些程序集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM