Azure DevOps YAML管道中MSBuild构建后发布工件为空,如何访问Release文件夹?
解决Azure DevOps Pipeline中PublishBuildArtifacts生成空工件的问题
这个问题我之前也碰到过,核心原因其实是MSBuild默认将编译输出放在项目自身的bin/Release目录下,而Azure DevOps的PublishBuildArtifacts@1任务默认会从$(Build.ArtifactStagingDirectory)(也就是日志里的D:\a\1\a)读取文件——两者路径不匹配,所以最终生成的drop工件是空的。
下面给你两种可行的解决方案,按需选择:
方案1:让MSBuild直接输出到工件暂存目录
修改你的MSBuild@1任务,在msbuildArguments中添加输出目录参数,让编译产物直接生成到$(Build.ArtifactStagingDirectory):
- task: MSBuild@1 inputs: solution: '**/Beper-EDI.sln' platform: '$(BuildPlatform)' configuration: '$(BuildConfiguration)' msbuildArguments: '/p:OutDir=$(Build.ArtifactStagingDirectory)\' clean: true # 其他保留的配置项...
这样MSBuild会把所有编译好的文件直接放到暂存目录,后续的PublishBuildArtifacts@1任务就能正常抓取到内容了。
方案2:添加复制任务,把编译产物同步到暂存目录
如果你不想修改MSBuild的默认输出路径,可以在MSBuild任务之后、发布任务之前,新增一个CopyFiles@2任务,将项目bin/Release下的文件复制到暂存目录:
# 原有的MSBuild任务保持不变 - task: MSBuild@1 inputs: solution: '**/Beper-EDI.sln' platform: '$(BuildPlatform)' configuration: '$(BuildConfiguration)' clean: true # 其他配置项... # 新增复制文件任务 - task: CopyFiles@2 inputs: SourceFolder: '$(Build.SourcesDirectory)' # 代码拉取的根目录,对应D:\a\1\s Contents: '**/bin/$(BuildConfiguration)/**' # 匹配所有项目的Release目录下的文件 TargetFolder: '$(Build.ArtifactStagingDirectory)' # 工件暂存目录,对应D:\a\1\a # 原有的发布任务保持不变 - task: PublishBuildArtifacts@1 inputs: ArtifactName: 'drop' pathToPublish: '$(Build.ArtifactStagingDirectory)'
这里用$(BuildConfiguration)变量代替硬编码的Release,能让配置更灵活,适配不同的编译环境。
执行完上述修改后,再运行流水线,drop工件就能包含你编译好的所有文件了。
内容的提问来源于stack exchange,提问作者Bastien Vandamme
相关产品推荐
相关产品推荐

