有关强制包约定的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
文件夹中,如上面引用的文档中的第二个示例所示。