You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Pipelines中dotnet publish找不到apphost.exe问题求助

解决Azure Pipelines中dotnet publish找不到apphost.exe的MSB3030错误

错误信息

/opt/hostedtoolcache/dotnet/sdk/6.0.412/Microsoft.Common.CurrentVersion.targets(5097,5): error MSB3030: Could not copy the file "/home/vsts/work/1/s/src/Api.Web/obj/Release/net6.0/win-x64/apphost.exe" because it was not found. [/home/vsts/work/1/s/src/Api.Web/Api.Web.csproj]

环境配置

Azure Pipelines步骤配置

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:
- task: UseDotNet@2
  displayName: 'Setting dotnet SDK'
  inputs:
    packageType: 'sdk'
    version: '6.x'

- task: NuGetToolInstaller@1
  inputs:
    versionSpec: '6.x'

- task: NuGetCommand@2
  displayName: 'NuGet restore'
  inputs:
    command: 'restore'
    restoreSolution: '$(solution)'
    feedsToUse: 'select'
    vstsFeed: 'c77b2597-5a55-4944-9a41-faeef2a74d81'

- task: DotNetCoreCLI@2
  displayName: Build Solution
  inputs:
    command: 'build'
    projects: '$(solution)'
    arguments: '--no-restore --configuration $(buildConfiguration)'

- task: DotNetCoreCLI@2
  displayName: Publish to artifactstagingdirectory
  inputs:
    command: publish
    publishWebProjects: false
    projects: |
      **/Api.Web.csproj
    arguments: '-f net6.0 --self-contained false --no-restore --r win-x64 --output $(Build.Artifactstagingdirectory)/$(Build.BuildNumber) --configuration $(buildConfiguration)'
    zipAfterPublish: false

- task: PublishBuildArtifacts@1
  displayName: Publish artifacts
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    artifactName: 'api'

Api.Web.csproj内容

<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <Nullable>disable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
        <Configurations>Debug;Release;Development;Test</Configurations>
        <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
        <RuntimeIdentifiers>win-x64</RuntimeIdentifiers>
        
        <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
        <RunAnalyzersDuringBuild>False</RunAnalyzersDuringBuild>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.*" />
        <PackageReference Include="Microsoft.Data.SqlClient" Version="5.*" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.*">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
        <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.*" />
        <PackageReference Include="Swashbuckle.AspNetCore" Version="6.*" />
        <PackageReference Include="Scrutor" Version="4.*" />
    </ItemGroup>

    <ItemGroup>
        <None Update="Microsoft.Data.SqlClient.dll">
            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </None>
    </ItemGroup>

    <ItemGroup>
        <ProjectReference Include="..\Api.Application\Api.Application.csproj" />
        <ProjectReference Include="..\Api.Infrastructure.Persistence\Api.Infrastructure.Persistence.csproj" />
    </ItemGroup>

</Project>

已尝试无效的方案

  • 移除dotnet publish步骤中的-r参数
  • 使用Debug配置进行发布
  • 将--self-contained false改为--no-self-contained
  • 切换至Linux虚拟机镜像

问题根源

错误核心是独立的build步骤未针对指定运行时(win-x64)构建,导致publish步骤无法找到对应运行时的apphost.exe文件:

  1. 当前build步骤默认用Any CPU构建,未指定运行时参数,不会生成win-x64对应的obj文件和apphost.exe
  2. publish步骤指定-r win-x64和--no-restore,跳过了运行时相关文件的生成逻辑,触发复制不存在文件的错误
  3. 非自包含Web应用默认不需要apphost.exe,但publish阶段因SDK逻辑仍尝试复制该文件

解决方案

方案1:统一build和publish的运行时参数

修改Build Solution任务,添加与publish一致的-r win-x64参数,确保build阶段生成对应运行时文件:

- task: DotNetCoreCLI@2
  displayName: Build Solution
  inputs:
    command: 'build'
    projects: '$(solution)'
    arguments: '--no-restore --configuration $(buildConfiguration) --r win-x64'

方案2:移除独立build步骤,由publish自动处理构建

dotnet publish会自动执行构建逻辑,单独的build步骤若参数不匹配易引发冲突。删除原Build Solution任务,保留publish参数(因已执行NuGet restore,可保留--no-restore):

# 移除原Build Solution任务
- task: DotNetCoreCLI@2
  displayName: Publish to artifactstagingdirectory
  inputs:
    command: publish
    publishWebProjects: false
    projects: |
      **/Api.Web.csproj
    arguments: '-f net6.0 --self-contained false --no-restore --r win-x64 --output $(Build.Artifactstagingdirectory)/$(Build.BuildNumber) --configuration $(buildConfiguration)'
    zipAfterPublish: false

方案3:禁用Web应用的apphost生成

非自包含Web应用无需apphost.exe,在Api.Web.csproj的PropertyGroup中添加配置阻止生成和复制该文件:

<PropertyGroup>
    <!-- 原有配置 -->
    <UseAppHost>false</UseAppHost>
</PropertyGroup>

验证建议

优先尝试方案2,简化Pipeline流程避免参数不一致问题;若仍有问题,再尝试方案3禁用apphost生成。

内容的提问来源于stack exchange,提问作者Nicolas Pierre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:32:03