VSTS使用ASP.NET模板构建无错误但未生成构建工件咨询
我帮你梳理几个可能的原因和排查步骤,应该能解决这个VSTS构建后无工件输出的问题:
1. 先确认PackageLocation参数的实际解析路径
你在MSBuild参数里指定了/p:PackageLocation="$(build.artifactstagingdirectory)",但首先得确认这个变量在构建过程中到底指向了哪里。建议你在构建流程里加一个命令行任务,执行echo $(build.artifactstagingdirectory),看看输出的路径是不是和发布步骤里提示的D:\VSTS Agents\DEV-QAS\A1\66\a完全一致。如果路径对不上,大概率是变量引用的上下文有问题,或者构建任务的配置没正确传递这个变量。
2. 检查Web项目的发布配置有没有覆盖参数
打开你的LRM网站项目的Properties\PublishProfiles目录下的发布配置文件(比如Default.pubxml),确认这几点:
- 配置里的
WebPublishMethod是不是Package,和你传递的MSBuild参数一致 PackageAsSingleFile有没有设为True- 重点看配置里有没有硬编码
PackageLocation路径——如果pubxml里已经写死了打包路径,那你传递的MSBuild参数会被覆盖,包就不会生成到工件目录里了。
3. 深挖构建日志,找打包步骤的痕迹
你提到日志里有aspnet_compiler的执行记录,但还要找带Package或Publish关键字的日志行,比如类似这样的:
Creating directory "D:\xxx\package".
Packaging into D:\xxx\package\LRM.zip.
如果完全找不到这类日志,说明打包步骤根本没被触发。这时候要排查:
- 你是不是在构建整个解决方案,而不是单独构建Web项目?如果是解决方案构建,得确保Web项目的构建配置里启用了
DeployOnBuild,或者在MSBuild参数里明确指定要构建的Web项目目标(比如msbuild LRM.sln /t:LRM_Web:Rebuild,把LRM_Web换成你的实际网站项目名称) - 检查解决方案的项目依赖,是不是Web项目的构建依赖没配置对,导致打包环节被跳过了?
4. 调整MSBuild参数,补全输出路径
有时候只指定PackageLocation可能不够,试试加上/p:OutDir="$(build.artifactstagingdirectory)\\"参数,确保编译输出和打包文件都指向工件目录。另外,PackageLocation的路径末尾最好加个反斜杠,避免路径拼接出错,调整后的参数如下:
/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\"
5. 确认ASP.NET版本和MSBuild版本匹配
从日志看,你用的是C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe,这是.NET Framework 4.0的编译器。如果你的Web项目是基于4.5及以上版本的.NET Framework,建议在VSTS的构建任务里选择对应版本的MSBuild工具(比如选"Visual Studio 2017"或更高版本),而不是用默认的.NET Framework内置MSBuild,版本不匹配也可能导致打包异常。
6. 最后检查"发布工件"步骤的配置
确认"Publish Build Artifacts"步骤里的"Path to publish"是不是准确指向$(build.artifactstagingdirectory),有没有被误改成其他路径。另外,记得勾选"Publish all files in artifact directory"选项,确保目录里的所有文件都被发布出去。
内容的提问来源于stack exchange,提问作者Dimitry Khan

