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

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

NuGet documentation on enforced package conventions说明:

NuGet copies assemblies from only a single library folder. For example, suppose a package has the following folder structure:

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

When the package is installed in a project that targets the .NET Framework 4, MyAssembly.dll (v2.0) is the only assembly installed. MyAssembly.Core.dll (v1.0) is not installed. (One reason why NuGet behaves this way is that MyAssembly.Core might have been merged into version 2.0 of MyAssembly.)

In this example, if you want MyAssembly.Core.dll to be installed in a project that targets the .NET Framework 4, you must include it in the Net40 folder as well as in the Net20 folder.

The rule about copying assemblies from only one folder also applies to the root lib folder. Suppose a package has the following folder structure:

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

In projects that target the .NET Framework 2.0 and the .NET Framework 3.5, NuGet copies both MyAssembly.dll and MyAssembly.Core.dll. But as was true of the previous example, in projects that target the .NET Framework 4, only MyAssembly.dll *from the *Net40 folder will be copied.

因此,对于第二个示例,提供了将包加载到 .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 文件中声明两个 "key" 版本吗:

<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:此枚举基于撰写本文时的list of supported target frameworks。此外,请注意,我不想支持 .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 框架版本,因为它认为所有这些版本都兼容。

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

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

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