2022年8月Azure windows-latest变更致dotnet pack失败求助
核心问题分析
报错路径D:\a\1\s\Company.Product\bin\Debug;VersionSuffix=build-pack-fix.2596\net40\Company.Product.dll里的分号是关键——这说明VersionSuffix属性被错误解析到了输出目录的Configuration字段中,导致路径拼接异常,找不到目标文件。这个问题是MSBuild 17.3.0(对应.NET SDK 6.0.400系列)的NuGet Pack任务逻辑变更引发的,而windows-latest镜像近期确实完成了MSBuild从17.2.0到17.3.0的升级,同时同步更新了.NET SDK版本。
可行解决方案
修正
dotnet pack参数传递方式:
避免依赖--version-suffix简写参数,改用MSBuild属性传递的方式明确指定版本后缀,同时强制指定编译配置:dotnet pack /p:Configuration=Debug /p:VersionSuffix=build-pack-fix.2596这种方式能避免属性被错误嵌入到输出路径的Configuration部分。
显式指定输出目录:
在dotnet pack命令中添加--output参数,彻底规避自动生成路径的解析问题:dotnet pack /p:Configuration=Debug /p:VersionSuffix=build-pack-fix.2596 --output $(Build.ArtifactStagingDirectory)临时回退到旧版本工具链:
如果需要快速恢复流水线运行,可以在Azure Pipelines中指定使用MSBuild 17.2.0对应的.NET SDK版本(如6.0.302),通过UseDotNet任务配置:- task: UseDotNet@2 inputs: packageType: 'sdk' version: '6.0.302'
关于windows-latest的变更说明
windows-latest镜像(当前指向Windows Server 2022)在近期更新中,将MSBuild版本从17.2.0升级到了17.3.0,同时.NET SDK也同步升级到6.0.400系列。这次更新调整了NuGet.Build.Tasks.Pack任务中输出路径的拼接逻辑,导致之前依赖简写参数的命令触发了路径解析错误。
内容的提问来源于stack exchange,提问作者Richard Barraclough

