0

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

4

1 回答 1

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"/>
于 2016-06-19T15:05:16.567 回答