Azure构建管道发布WebJob时如何避免生成额外项目目录?
解决DotNetCoreCLI发布WebJob时生成额外项目名目录的问题
这个问题我之前也碰到过,核心原因是dotnet publish命令在搭配--output参数指定单个项目发布时,默认会在你设定的输出路径下自动创建一个以项目名称命名的子目录来存放编译产物。而Azure触发型WebJob要求所有运行文件必须直接放在App_Data\jobs\triggered\{JobName}目录下,嵌套额外目录会导致WebJob无法正常识别运行,所以得调整发布参数来规避这个问题。
最优解决方案:改用MSBuild的PublishDir属性指定输出路径
直接修改你的任务arguments参数,用MSBuild原生的/p:PublishDir=替代--output,就能让编译产物直接输出到目标目录,不会生成多余的子目录。调整后的任务配置如下:
- task: DotNetCoreCLI@2 displayName: 'dotnet publish' inputs: command: 'publish' projects: '**/MyProj.csproj' arguments: '--configuration $(buildConfiguration) /p:PublishDir=$(build.artifactstagingdirectory)\webjob\App_Data\jobs\triggered\MyProjWebJob /p:AssemblyVersion=$(GitVersion.AssemblySemVer)' zipAfterPublish: false publishWebProjects: false
为什么这个方法有效?
--output是dotnet CLI层面的参数,它的设计逻辑是为每个发布的项目创建独立子目录(哪怕你只发布单个项目);而PublishDir是MSBuild的原生属性,直接控制编译产物的最终输出位置,不会额外添加目录层级,完美匹配WebJob的目录结构要求。
备选方案:发布后移动文件(不推荐,仅作参考)
如果你因某些限制无法修改publish参数,也可以在发布任务后追加文件操作任务,把产物从自动生成的子目录复制到目标目录,再删除多余的子目录:
# 保留原有发布任务 - task: DotNetCoreCLI@2 displayName: 'dotnet publish' inputs: command: 'publish' projects: '**/MyProj.csproj' arguments: '--configuration $(buildConfiguration) --output $(build.artifactstagingdirectory)\webjob\App_Data\jobs\triggered\MyProjWebJob /p:AssemblyVersion=$(GitVersion.AssemblySemVer)' zipAfterPublish: false publishWebProjects: false # 复制产物到目标根目录 - task: CopyFiles@2 displayName: 'Copy WebJob files to root directory' inputs: SourceFolder: '$(build.artifactstagingdirectory)\webjob\App_Data\jobs\triggered\MyProjWebJob\my.proj.webjob' Contents: '**' TargetFolder: '$(build.artifactstagingdirectory)\webjob\App_Data\jobs\triggered\MyProjWebJob' # 删除多余的项目子目录 - task: DeleteFiles@1 displayName: 'Remove extra project directory' inputs: SourceFolder: '$(build.artifactstagingdirectory)\webjob\App_Data\jobs\triggered\MyProjWebJob' Contents: 'my.proj.webjob'
不过这个方案需要硬编码子目录名称,灵活性较差,所以优先推荐第一种方法。
内容的提问来源于stack exchange,提问作者Percy
相关产品推荐
相关产品推荐

