是否必须在NuGet包中指定所有中间目标框架版本?

时间:2016-06-19 10:14:48

标签: .net nuget target-framework

NuGet documentation on enforced package conventions解释说:

  

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"/>

<?SUP> 1

2)同样,一旦我发布了这个包,它是否适用于框架的未来版本,或者我需要在.NET 4.6.2,4.6.3,4.7或者更新版本时立即更新包一般来说,任何大于.NET 4.6.1?

请注意,我只问一个问题。我只是用三种不同的方式写下来来说明它的重要性。

1 :此枚举基于撰写本文时的list of supported target frameworks。此外,请注意我不想支持.NET 1.1(也没有任何其他框架),因此我不想将任何库直接添加到lib文件夹,如上面引用的文档中的第二个示例所示。

1 个答案:

答案 0 :(得分:0)

使用包含以下内容的NuGet包

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

如果将上述内容安装到面向.NET 3.5的项目中,则将引用Net20文件夹中的程序集。 NuGet将选择具有相同版本或更旧版本的目标.NET框架版本,因为它认为所有这些版本都兼容。

因此,您不需要为每个框架版本在NuGet包中都有一个目录。

一般规则是,您的NuGet包应该只包含您实际包含的程序集的框架的目录。当发布更新版本的.NET框架时,仍然可以使用NuGet包。所以在你的第二个例子中,我将使用更简单的.nuspec文件创建NuGet包:

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