从NuGet还原步骤排除.NET Standard/.NET Core项目后VSTS构建报错如何解决?
我之前在迁移.NET项目到Azure DevOps(原VSTS)构建时,也碰到过完全一样的报错,结合你的需求(排除.NET Core/Standard项目在NuGet还原步骤),给你几个针对性的解决方案:
1. 拆分还原步骤,明确不同项目的还原方式
.NET Framework和.NET Core/Standard的NuGet依赖还原机制差异很大,混在一起极易出问题,建议按项目类型拆分步骤:
- 第一步:NuGet Restore 步骤(仅处理.NET Framework项目)
在步骤的「路径」设置里,通过文件匹配规则排除.NET Core/Standard项目,比如用:
这样就只会还原传统.NET Framework项目的NuGet包。**\*.csproj;-:**\*.NetCore.csproj;-:**\*.NetStandard.csproj - 第二步:dotnet restore 步骤(仅处理.NET Core/Standard项目)
指定这些项目的路径或者解决方案,比如:
确保这个步骤能覆盖到所有报错的Core/Standard项目,生成对应的dotnet restore YourSolution.sln --verbosity normalproject.assets.json。 - 第三步:VS Build 步骤
一定要取消勾选「还原NuGet包」选项!这个选项依赖传统NuGet.exe还原流程,对Core项目不适用,反而会干扰之前dotnet restore生成的文件,导致找不到assets.json。
2. 验证dotnet restore的作用范围
有时候dotnet restore如果没指定具体的项目/解决方案,可能只会还原当前目录下的项目,而报错的项目在子目录里没被覆盖到。可以在dotnet restore步骤里明确指定解决方案路径,或者用通配符匹配所有Core/Standard项目:
dotnet restore **\*.NetCore.csproj **\*.NetStandard.csproj
3. 清理构建缓存,避免旧文件干扰
构建目录里的旧obj文件夹可能残留损坏的缓存文件,导致新的assets.json无法生成。可以在所有还原步骤前加一个清理步骤:
- 添加一个Command Line步骤,执行:
或者用PowerShell步骤直接删除所有dotnet clean YourSolution.sln --verbosity quietobj文件夹:Remove-Item -Recurse -Force **\obj
4. 检查代理服务器的.NET SDK版本
报错里显示用的是2.1.100版本的SDK,如果你的项目目标框架是更高版本(比如.NET Core 3.1/5+),代理服务器上可能缺少对应的SDK。可以在dotnet restore步骤前加一个dotnet --list-sdks命令,确认已安装的SDK版本是否匹配项目需求,如果不匹配,需要在代理上安装对应版本的SDK,或者在dotnet restore里指定--sdk-version参数强制使用特定版本:
dotnet restore YourSolution.sln --sdk-version 3.1.401
问题根源说明
简单来说,.NET Core/Standard项目的依赖信息是通过dotnet restore生成project.assets.json,而VS Build的「还原NuGet包」选项用的是传统NuGet.exe流程,它不会为Core项目生成这个文件。同时如果dotnet restore没覆盖到报错的项目,或者后续被VS Build的还原操作干扰,就会出现找不到文件的报错。
内容的提问来源于stack exchange,提问作者Riddari

