升级Umbraco至13.x后DevOps构建报错:project.assets.json无net8.0目标
问题概述
将Umbraco从10.x(.NET 6)升级到13.x(.NET 8)后,流水线构建未提示失败,但产物中的myproj.deps.json和myproj.runtimeconfig.json仍指向.NETCoreApp,Version=v6.0,本地构建/发布则正常使用.NET 8。添加.NET 8 SDK指定任务后,构建时出现NETSDK1005错误:
##[error]C:\hostedtoolcache\windows\dotnet\sdk\8.0.204\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets(266,5): Error NETSDK1005: Assets file 'D:\a\8\s\Dev\Main\myproj\obj\project.assets.json' doesn't have a target for 'net8.0'. Ensure that restore has run and that you have included 'net8.0' in the TargetFrameworks for your project.
已尝试的方案包括:指定.NET 8 SDK、确认.NET 8环境、安装NuGet 5.8、切换构建主机、修改项目文件的TargetFramework节点,但均未解决问题。
解决建议
1. 拆分Build与Restore任务,移除--no-restore参数
构建时使用--no-restore会跳过依赖还原步骤,流水线中残留的旧project.assets.json(对应.NET 6)未被更新。需先执行还原,再执行构建,且还原步骤必须使用.NET 8 SDK:
# 先执行依赖还原 - task: DotNetCoreCLI@2 displayName: 'Dotnet Restore (NET 8)' inputs: command: 'restore' projects: '**/myproj.csproj' arguments: '--configuration $(BuildConfiguration) --framework net8.0' # 再执行构建 - task: DotNetCoreCLI@2 displayName: 'Build Project' inputs: projects: '**/myproj.csproj' arguments: '--configuration $(BuildConfiguration) --framework net8.0'
2. 清理流水线缓存的旧构建产物
流水线可能缓存了旧的obj/bin目录,导致新的还原和构建无法覆盖旧文件。在还原前添加清理步骤:
# 清理旧的obj和bin目录 - task: DotNetCoreCLI@2 displayName: 'Dotnet Clean' inputs: command: 'clean' projects: '**/myproj.csproj' arguments: '--configuration $(BuildConfiguration)'
或者直接用命令行删除目录:
- task: CmdLine@2 displayName: 'Clean obj/bin Folders' inputs: script: | rd /s /q "$(Build.SourcesDirectory)/Dev/Main/myproj/obj" rd /s /q "$(Build.SourcesDirectory)/Dev/Main/myproj/bin"
3. 彻底检查项目文件的.NET版本配置
确保项目文件(myproj.csproj)中无残留的.NET 6配置:
- 单目标框架使用
<TargetFramework>net8.0</TargetFramework>,多目标框架使用<TargetFrameworks>net8.0</TargetFrameworks>(无需保留net6.0) - 检查是否存在
<RuntimeFrameworkVersion>节点,确保值为8.0.x(如8.0.5) - 移除任何针对.NET 6的条件编译节点(如
Condition="'$(TargetFramework)' == 'net6.0'")
4. 调整任务顺序,确保.NET 8 SDK优先加载
将UseDotNet@2任务放在所有dotnet命令和NuGet安装任务之前,避免后续命令使用默认的.NET 6 SDK:
# 第一步:安装并启用.NET 8 SDK - task: UseDotNet@2 displayName: 'Use .NET Core SDK 8.x' inputs: version: 8.x includePreviewVersions: false # 第二步:安装适配.NET 8的NuGet版本(建议6.x及以上) - task: NuGetToolInstaller@1 displayName: 'Use NuGet 6.x' inputs: versionSpec: 6.x # 后续执行Clean、Restore、Build任务...
5. 检查流水线环境变量
确认流水线中未设置强制使用.NET 6的环境变量,例如DOTNET_ROLL_FORWARD、MSBuildSDKsPath等,这些变量可能会覆盖SDK版本选择逻辑。
内容的提问来源于stack exchange,提问作者user3447577

