VSTS执行dotnet clean失败:RC版.NET Core SDK问题及解决咨询
dotnet clean失败问题 首先咱们先理清几个核心问题:
为什么代理会使用RC版本?
你提到的那个阻止安装预览/RC版本的镜像脚本,作用是防止新的预览版SDK被安装到代理机器上,但如果机器在脚本生效前就已经预装了RC版本(比如镜像更新前就存在),脚本不会主动移除已有的预览版本。而dotnet命令默认会优先使用机器上安装的最新版本,所以就出现了仍然调用RC版SDK的情况。
快速修复方案
1. 用global.json强制指定正式版SDK
这是最可靠的跨环境解决方案,不管代理上预装了什么版本,项目都会严格使用你指定的正式版。在项目根目录创建一个global.json文件,内容如下(替换为你需要的正式版SDK版本,比如2.1.300正式版):
{ "sdk": { "version": "2.1.300" } }
把这个文件提交到代码仓库,下次构建时dotnet命令就会自动切换到指定的正式版SDK,彻底避开RC版本的问题。
2. 调整构建流程,确保NuGet还原前置
从错误日志看,dotnet clean失败是因为找不到project.assets.json——这个文件是NuGet还原生成的。RC版本的.NET Core SDK在执行clean目标时,错误地依赖了这个文件(正式版已经修复了这个逻辑)。你可以在VSTS构建流程中,把NuGet还原步骤放在dotnet clean之前,或者在clean步骤前先执行dotnet restore命令,确保assets文件存在。
3. 自托管代理:手动清理RC版本
如果你的代理是自托管的,可以直接去代理机器的「控制面板→程序和功能」里卸载.NET Core SDK 2.1.300-rc1-008673,然后安装对应的正式版SDK。这样机器默认就会使用正式版SDK了。
补充说明
对于VSTS托管代理,微软的镜像更新存在一定延迟,虽然已经有了阻止安装预览版的脚本,但已有的RC版本需要等镜像迭代更新才会被移除。所以用global.json指定版本是最稳妥的方案,不管是托管还是自托管代理都能生效。
内容的提问来源于stack exchange,提问作者Kevin Smith

