如何在Azure DevOps构建流水线中获取指定项目的构建输出目录?
解决方案
以下是三种可以完全避免硬编码路径的方案,优先推荐前两种实现成本更低、稳定性更高:
方案1:构建时显式指定输出目录(最推荐)
你可以在执行dotnet build命令时,针对指定的集成测试项目单独加--output(简写-o)参数,把构建产物输出到固定的统一路径,完全不需要关心项目本身的默认输出规则:
- task: DotNetCoreCLI@2 displayName: 'dotnet build $(buildConfiguration)' inputs: command: 'build' arguments: '--configuration $(buildConfiguration) /tests/IntergationTests/IntegrationTests.csproj -o $(Build.ArtifactStagingDirectory)/IntegrationTests'
之后发布任务直接引用这个输出路径即可:
- task: PublishBuildArtifacts@1 displayName: 'Publish integration tests artifacts' inputs: pathtoPublish: '$(Build.ArtifactStagingDirectory)/IntegrationTests' artifactName: 'IntegrationTests'
如果你的构建任务需要同时构建整个解决方案,不想单独拆分测试项目的构建,也可以给全局build命令加-o参数把所有项目的输出都放到统一目录,之后按项目名筛选对应产物即可。
方案2:单独针对测试项目执行dotnet publish命令
如果你的核心需求是拿到可直接运行的测试项目产物,更推荐直接用publish命令替代单独build+找路径的流程,publish会自动把所有运行依赖都打包输出,更适合发布构建产物的场景:
- task: DotNetCoreCLI@2 displayName: 'Publish integration tests project' inputs: command: 'publish' projects: '/tests/IntergationTests/IntegrationTests.csproj' arguments: '--configuration $(buildConfiguration) -o $(Build.ArtifactStagingDirectory)/IntegrationTests' publishWebProjects: false # 重点:非Web项目必须设置为false,否则任务会自动跳过该项目
后续发布任务和方案1一致,直接引用指定的输出路径即可。
方案3:通过MSBuild属性获取默认输出路径(不修改现有构建流程)
如果不想修改原有构建逻辑,也可以在构建后通过MSBuild命令查询项目的输出路径并存到变量中使用,避免硬编码:
- task: PowerShell@2 displayName: 'Get integration tests output path' inputs: targetType: 'inline' script: | $outputPath = dotnet msbuild /tests/IntergationTests/IntegrationTests.csproj /t:GetTargetPath /p:Configuration=$(buildConfiguration) /nologo /v:q Write-Host "##vso[task.setvariable variable=IntegrationTestsOutputPath]$outputPath"
之后发布任务直接引用变量即可:
- task: PublishBuildArtifacts@1 displayName: 'Publish integration tests artifacts' inputs: pathtoPublish: '$(IntegrationTestsOutputPath)' artifactName: 'IntegrationTests'
内容的提问来源于stack exchange,提问作者Liero
相关产品推荐
相关产品推荐

