我有一个引用各种NuGet
包的.NET Core 2.2.0
应用程序。
.NET Core
依赖于.csproj
项目文件中定义的PackageReference
样式包。 它不依赖于packages.config
尽管如此,我希望Restore NuGet Packages
(或Build
(将所有引用的包及其依赖项包下拉到项目packages
文件夹中(对等级别到.csproj
或.sln
文件(。
我之所以预料到这一点,是因为我的理解是,.NET Core
遵循开源包管理器的许多约定,例如npm
,这些约定以自给自足的应用程序域的原则运行。
但是,绝大多数软件包都下拉到此文件夹:
C:Usersusername.nugetpackages
(几个包被拉入项目packages
文件夹 - 我看不出这些包有什么不同。
显然,Visual Studio
和/或NuGet
更愿意避免重复工作并集中缓存几乎所有软件包。
这是为什么呢?并且可以以不同的方式配置吗?
首先,您描述的"开源包管理器"行为并不是真正的"开源包管理器"行为。它是一些包管理器的实现。例如,Java的Maven(mvn
(与.NET Core做同样的事情,你不能声称maven是闭源的。
其次,一些包管理器,例如npm
将所有依赖项复制到包目录中(例如,node_modules
(,因为它们使用源,而不是二进制,并且因为它们获取传递源和多个依赖项名称相同但版本不同。NuGet 不会这样做。它仅使用二进制文件,不支持多个版本。NuGet 仅为项目中的每个依赖项解析一个版本。有关更多信息,请参阅此堆栈溢出帖子。解析和使用的确切版本将写出到构建目录中的.deps.json
文件中。
第三,.NET Core 的自包含部署(无需任何其他其他依赖项即可执行/分发(不使用包缓存。发布应用程序时(dotnet publish
在命令行上(,所有依赖项都将复制到发布目录。版本是deps.json
文件中的版本,就像我上面说的。
因此,主要的 nuget 包缓存(在您的系统上与其他项目共享(只是 .NET Core 二进制文件的简单缓存。没有理由它必须是项目唯一的才能复制到项目目录中。