如何在.NET Core 2应用中仅用deps.json还原依赖及手动下载依赖
针对你的两个.NET Core 2相关的问题,我来分享实际项目中验证过的可行方案:
问题1:如何在.NET Core 2应用中仅依靠deps.json文件还原依赖项?
.NET Core的dotnet restore通常依赖项目/解决方案文件,但只有deps.json的话,我们可以通过临时项目文件+依赖解析的方式来实现:
提取deps.json中的依赖信息
打开你的deps.json,找到libraries节点,这里列出了应用所有的NuGet依赖,格式是[包名]/[版本号](比如Newtonsoft.Json/13.0.3)。你可以手动整理这些条目,或者写个简单脚本(比如PowerShell、Python)自动提取——用PowerShell的Get-Content结合ConvertFrom-Json就能快速完成解析。创建临时项目文件
新建一个极简的.csproj文件(比如命名为temp-restore.csproj),把刚才提取的依赖添加到<PackageReference>节点中:<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netcoreapp2.0</TargetFramework> </PropertyGroup> <ItemGroup> <!-- 替换成你从deps.json里提取的依赖 --> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" /> </ItemGroup> </Project>执行还原命令
在终端运行以下命令,指定依赖包的输出目录(比如./packages):dotnet restore temp-restore.csproj --packages ./packages如果你的依赖来自私有NuGet源,记得先配置
nuget.config添加源地址,或者在命令里加上--source [私有源URL]参数。
完成后,./packages目录里就会有所有deps.json中定义的依赖包了。
问题2:在没有项目(解决方案)的情况下,如何下载依赖清单文件(*.deps.json)中定义的所有依赖项?类似自包含部署(SCD)通过dotnet publish实现的效果,但需在目标服务器上手动操作。
要实现类似SCD的效果(包含所有依赖+运行时),有两种实用方法:
方法1:临时项目+dotnet publish(推荐)
这种方式最接近官方SCD的效果,步骤简单且不易出错:
- 按照问题1的方法创建临时
.csproj文件,确保TargetFramework和你的应用完全一致。 - 运行
dotnet publish命令,指定运行时标识符(RID)、自包含模式和输出目录:
这里的# 示例:针对Windows x64系统 dotnet publish temp-restore.csproj -c Release -r win-x64 --self-contained true --output ./scd-output-r参数要匹配目标服务器的系统(比如linux-x64、osx-x64),--self-contained true会自动下载对应的.NET Core 2.x运行时,最终./scd-output目录的结构和官方SCD发布的完全一致。
方法2:手动下载依赖+运行时(适合自定义场景)
如果不想用临时项目,可以拆分步骤手动操作:
- 批量下载NuGet依赖:用
dotnet nuget download命令逐个下载deps.json里的依赖,比如:
你也可以写脚本批量处理所有依赖,提升效率。dotnet nuget download Newtonsoft.Json --version 13.0.3 --output ./packages - 下载.NET Core运行时:使用官方的安装脚本(
dotnet-install.ps1适用于Windows,dotnet-install.sh适用于Linux/macOS),指定运行时版本和RID,把运行时下载到本地:# Linux/macOS示例:下载.NET Core 2.2运行时,x64架构 ./dotnet-install.sh --version 2.2.8 --runtime dotnet --architecture x64 --install-dir ./runtime - 整合文件:把
./packages里每个包的lib/netcoreapp2.0下的dll复制到应用目录,再把./runtime里的运行时文件也复制过来,最终结构就和SCD一致了。
注意事项
- 一定要确保RID和目标服务器的操作系统、架构完全匹配,否则会出现兼容性问题。
- 如果依赖私有源的包,提前在目标服务器上配置
nuget.config,添加源地址和必要的凭据。
内容的提问来源于stack exchange,提问作者Viacheslav




