指定PublishProfile时Dotnet build报错:Only one project can be specified
我之前在Windows Jenkins上部署ASP.NET Core到Azure时,也碰到过和你几乎一模一样的情况——本地命令行跑的好好的,Jenkins一执行就炸。结合我踩过的坑,给你几个排查和解决的方向:
先确认Jenkins工作目录的项目路径
你遇到的MSB10xx错误大概率是路径问题!Jenkins拉取代码后的工作目录和你本地命令行的路径完全不同,一定要确保dotnet build命令是在项目文件(.csproj或.sln)所在的目录下执行的。
比如你的项目文件在Jenkins\workspace\MyApp\src\MyApp.csproj,那Jenkins构建步骤里得先加一步cd src,再执行dotnet命令。还可以在执行build前加个dir命令,打印当前目录的文件列表,确认项目文件和PublishProfile都存在。检查PublishProfile文件的存在性和权限
你的mycoolprofile.pubxml应该放在项目的Properties\PublishProfiles目录下对吧?先确认Jenkins拉代码的时候有没有把这个文件拉下来——可以在Jenkins里加一步dir Properties\PublishProfiles查看。
另外,Windows Jenkins默认用Local System账号运行,这个账号的权限可能不够读取PublishProfile文件。你可以尝试把Jenkins服务改成用有足够权限的本地账号(比如你的开发账号)运行,再重新构建试试。核对dotnet SDK版本
本地命令行用的dotnet SDK版本和Jenkins服务器上的是不是一致?不同版本的MSBuild对发布参数的处理可能有差异。在Jenkins里执行dotnet --version,和本地的版本对比一下,尽量保持一致。如果版本不同,可以在Jenkins上安装对应版本的SDK,或者在项目根目录加一个global.json文件指定SDK版本。换成dotnet publish命令试试
有时候用dotnet build加/p:DeployOnBuild=true的方式在CI环境里容易出兼容问题,不如直接用dotnet publish命令更可靠,比如:dotnet publish -c Release /p:PublishProfile=mycoolprofile这个命令直接完成发布流程,不需要依赖build的额外参数,在CI环境里稳定性更高。
拿到完整的错误信息
你贴的报错只到MSB10...,后面的具体错误代码(比如MSB1009是找不到项目文件,MSB1008是参数错误)和描述才是定位问题的关键!去Jenkins的构建日志里把完整的错误信息找出来,能更快锁定问题根源。
内容的提问来源于stack exchange,提问作者Mando

