簡體   English   中英

是否必須在NuGet軟件包中指定所有中間目標框架版本?

[英]Do all intermediate target framework versions have to be specified in NuGet packages?

關於強制打包約定NuGet文檔說明:

NuGet僅從單個庫文件夾復制程序集。 例如,假設一個程序包具有以下文件夾結構:

 \\lib \\Net20 \\MyAssembly.dll (v1.0) \\MyAssembly.Core.dll (v1.0) \\Net40 \\MyAssembly.dll (v2.0) 

當該軟件包安裝在面向.NET Framework 4的項目中時,MyAssembly.dll(v2.0)是唯一安裝的程序集。 未安裝MyAssembly.Core.dll(v1.0)。 (NuGet如此行為的一個原因是MyAssembly.Core可能已合並到MyAssembly的2.0版中。)

在此示例中,如果要將MyAssembly.Core.dll安裝在以.NET Framework 4為目標的項目中,則必須將其包含在Net40文件夾以及Net20文件夾中。

僅從一個文件夾復制程序集的規則也適用於根lib文件夾。 假設程序包具有以下文件夾結構:

 \\lib \\MyAssembly.dll (v1.0) \\MyAssembly.Core.dll (v1.0) \\Net40 \\MyAssembly.dll (v2.0) 

在針對.NET Framework 2.0和.NET Framework 3.5的項目中,NuGet會同時復制MyAssembly.dll和MyAssembly.Core.dll。 但是,與前面的示例一樣,在面向.NET Framework 4的項目中,將僅復制* Net40文件夾中的MyAssembly.dll。

因此,對於第二個示例,提供了一個解釋,將包加載到.NET 3.5項目時會發生什么。

不幸的是,第一個示例缺少此信息。 .NET 3.5項目將從第一個示例中顯示的NuGet包中獲取哪些文件? .NET 3.5項目將僅獲取文件,還是將目標程序中的向后兼容所支持的最高框架版本作為目標庫(對於.NET 3.5項目,這將意味着該庫是.NET 2.0版本)?

我對這個問題感興趣的原因有兩個具體含義:假設我提供的程序集已經為我編譯了.NET 2.0版本(應將其用於從2.0到4.6的所有.NET Framework版本),以及一個。 NET 4.6.1版本(使用在.NET 4.6.1中引入的一些新的BCL API,打算在.NET 4.6.1及更高版本中使用)。

1)我可以簡單地在.nuspec文件中聲明兩個“密鑰”版本:

<file src="net20\MyLibrary.dll" target="lib\Net20"/>
<file src="net461\MyLibrary.dll" target="lib\Net461"/>

還是我必須列出所有中間支持的版本:

<file src="net20\MyLibrary.dll" target="lib\Net20"/>
<file src="net20\MyLibrary.dll" target="lib\Net35"/>
<file src="net20\MyLibrary.dll" target="lib\Net40"/>
<file src="net20\MyLibrary.dll" target="lib\Net403"/>
<file src="net20\MyLibrary.dll" target="lib\Net45"/>
<file src="net20\MyLibrary.dll" target="lib\Net451"/>
<file src="net20\MyLibrary.dll" target="lib\Net452"/>
<file src="net20\MyLibrary.dll" target="lib\Net46"/>
<file src="net461\MyLibrary.dll" target="lib\Net461"/>

1個

2)同樣,一旦發布了此軟件包,它將適用於該框架的未來版本,還是在存在.NET 4.6.2、4.6.3、4.7或一般情況下,我需要立即更新該軟件包,什么比.NET 4.6.1大?

請注意,我只問一個問題。 我只是以三種不同的方式寫下來說明其重要性。

1 :此枚舉基於撰寫本文時受支持的目標框架列表 此外,請注意,我不想支持.NET 1.1(也不支持任何其他框架),因此,我不想將任何庫直接添加到lib文件夾中,如上面引用的文檔中的第二個示例所示。

使用包含以下內容的NuGet軟件包:

\lib
    \Net20
        \MyAssembly.dll (v1.0)
        \MyAssembly.Core.dll (v1.0)
    \Net40
        \MyAssembly.dll (v2.0)

如果將上述內容安裝到面向.NET 3.5的項目中,則將引用Net20文件夾中的程序集。 NuGet將選擇具有相同版本或更舊版本的目標.NET Framework版本,因為它認為所有這些版本都兼容。

因此,您無需在每個框架版本的NuGet包中都有一個目錄。

一般規則是,您的NuGet軟件包應只為那些實際包含的程序集的框架提供目錄。 當發布.NET框架的較新版本時,仍然可以使用NuGet軟件包。 因此,在第二個示例中,我將使用更簡單的.nuspec文件創建NuGet包:

<file src="net20\MyLibrary.dll" target="lib\Net20"/>
<file src="net461\MyLibrary.dll" target="lib\Net461"/>

暫無
暫無

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

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