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文件:
- 当前build步骤默认用Any CPU构建,未指定运行时参数,不会生成win-x64对应的obj文件和apphost.exe
- publish步骤指定
-r win-x64和--no-restore,跳过了运行时相关文件的生成逻辑,触发复制不存在文件的错误 - 非自包含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
相关产品推荐
相关产品推荐

