.NET Core 将 NuGet 包下拉到用户缓存



我有一个引用各种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 二进制文件的简单缓存。没有理由它必须是项目唯一的才能复制到项目目录中。

最新更新