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

Caching .NET Core下拉式NuGet包到用户缓存,caching,.net-core,reference,package,nuget,Caching,.net Core,Reference,Package,Nuget,我有一个.netcore2.2.0应用程序,它引用了各种NuGet软件包 .NET Core依赖于在.csproj项目文件中定义的PackageReference样式包。它不依赖于packages.config 然而,我希望Restore-NuGet-Packages(或Build)将所有引用的包及其依赖项包下拉到项目Packages文件夹中(对等级别为.csproj或.sln文件) 我之所以这么想,是因为我的理解是,.NET Core遵循了开源软件包管理器的许多约定,比如npm,它们以自给自足

我有一个
.netcore2.2.0
应用程序,它引用了各种
NuGet
软件包

.NET Core
依赖于在
.csproj
项目文件中定义的
PackageReference
样式包。它不依赖于
packages.config

然而,我希望
Restore-NuGet-Packages
(或
Build
)将所有引用的包及其依赖项包下拉到项目
Packages
文件夹中(对等级别为
.csproj
.sln
文件)

我之所以这么想,是因为我的理解是,
.NET Core
遵循了开源软件包管理器的许多约定,比如
npm
,它们以自给自足的应用程序域为原则进行操作

但是,绝大多数软件包都会被下拉到此文件夹:

C:\Users\username\.nuget\packages\

(几个包拉入项目
文件夹-我看不出这些包有什么不同。)

显然
visualstudio
和/或
NuGet
更喜欢避免重复工作并集中缓存几乎所有包

为什么会这样?它可以进行不同的配置吗?

首先,您描述的“开源软件包管理器”行为并不是真正的“开源软件包管理器”行为。它是一些包管理器的实现。例如,Java的Maven(
mvn
)与.NETCore的功能相同,您不能声称Maven是封闭源代码的

其次,一些包管理器,例如
npm
将所有依赖项复制到包目录中(例如,
node_modules
),因为它们使用源文件,而不是二进制文件,并且因为它们获取可传递的源文件和多个依赖项相同的名称但不同的版本。努吉不会那样做。它只使用二进制文件,不支持多个版本。NuGet仅为项目中的每个依赖项解析一个版本。解析和使用的确切版本将写入构建目录中的
.deps.json
文件

第三,.NET Core的自包含部署(即无需任何其他依赖项即可执行/分发)不使用包缓存。发布应用程序时(
dotnet publish
在命令行上),所有依赖项都会复制到发布目录。版本是
deps.json
文件中的版本,如我上面所说


因此,主nuget包缓存(在您的系统上与其他项目共享)只是.NETCore的二进制文件的简单缓存。没有理由将其复制到项目目录时必须是项目独有的。

什么是“自给自足的应用程序域原则”?所有软件包都缓存在一个中心位置,以减少重复(节省磁盘空间,减少下载时间)。毕竟,它只是一个缓存。为什么要更改它?部署集合和容器。对不起,我完全不明白。这就是“自给自足应用程序域原则”的含义吗?什么是“部署集”?nuget包缓存是开发时的事情。发布应用程序后,应用程序不会使用nuget缓存。如果所有引用的软件包都位于应用程序域中的软件包文件夹中,则可以清楚地知道正在使用哪些版本。在my
.csproj
中,我有一个
PackageReference
Newtonsoft.Json.12.0.2
dotnet publish
运行本地写入
Newtonsoft.Json.dll
v12.0.2
publish
文件夹。但在
TeamCity
dotnet publish
上,复制
Newtonsoft.Json.dll
v9.0.2
到publish文件夹。即使我包含
packages.lock.json
,也会发生这种情况。引用的Microsoft软件包对
v9.0.2
v12.0.2
(以及许多其他版本)都有间接依赖性,但我看不到对最大版本号的任何限制,因此我认为应该选择
v12.0.2
<代码>v9.0.2与一个库不兼容,因此出现运行时错误。