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

VS可构建项目在Azure Pipeline发布失败,报错缺失静态资源清单

问题排查:Azure Pipeline发布.NET6项目时StaticWebAssets缺失错误

背景

为某应用新建Azure Pipeline用于编译生成Windows可执行文件Artifact,该应用原通过Docker Pipeline运行完全正常,且相同Pipeline在其他项目可正常工作,但当前Pipeline在Publish阶段失败。

环境配置

Pipeline基础配置

pool:  
  vmImage: ‘windows-latest’

variables:
  name: runtimeIdentifier  
  default: win-x64

Publish任务配置

- task: DotNetCoreCLI@2
  displayName: Publish
  inputs:
    command: publish
    publishWebProjects: false
    projects: '${{Parameters.buildProjects}}'
    arguments: '--configuration Release --output $(build.artifactstagingdirectory) --no-restore --no-build -r ${{Parameters.runtimeIdentifier}} --self-contained true --nologo -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:Version=$(Build.BuildNumber) -p:DebugType=embedded'
    zipAfterPublish: True

项目csproj核心配置

<TargetFramework>net6.0</TargetFramework>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<OutputType>Exe</OutputType>
<RuntimeIdentifiers>linux-musl-x64;win-x64</RuntimeIdentifiers>
<ErrorOnDuplicatePublishOutputFiles>False</ErrorOnDuplicatePublishOutputFiles>

项目引用的Microsoft包

<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.4" NoWarn="NU1605" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="6.0.4" NoWarn="NU1605" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="7.0.2" />
<PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.15.1" />

错误信息

Publish阶段触发如下错误:

C:\Program Files\dotnet\sdk\7.0.103\Sdks\Microsoft.NET.Sdk.Razor\targets\Microsoft.NET.Sdk.Razor.StaticWebAssets.targets(658,7): 
error : Manifest file at 'obj\Release\net6.0\win-x64\staticwebassets.build.json' not found. 
[D:\a\1\s\src\FieldPlug\ProductLine\Product\Product.csproj]

Pipeline运行关键日志片段:

"C:\Program Files\dotnet\dotnet.exe" publish D:\a\1\s\src\FieldPlug\ProductLine\Product --configuration Release --output D:\a\1\a\SNMP --no-restore --no-build -r win-x64 --self-contained true --nologo -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:Version=1.8.3-beta3-152-snmp -p:DebugType=embedded
**C:\Program Files\dotnet\sdk\7.0.103\Sdks\Microsoft.NET.Sdk.Razor\targets\Microsoft.NET.Sdk.Razor.StaticWebAssets.targets(658,7): error : Manifest file at 'obj\Release\net6.0\win-x64\staticwebassets.build.json' not found. [D:\a\1\s\src\FieldPlug\ProductLine\Product\Product.csproj]**
##[error]Error: The process 'C:\Program Files\dotnet\dotnet.exe' failed with exit code 1

初步排查方向

  • SDK版本不匹配:项目目标框架为.NET6,但Pipeline自动使用了.NET7 SDK(7.0.103),跨版本构建可能引发兼容性问题
  • 非Web项目触发Web构建逻辑:项目引用了AspNetCore相关包,导致Razor StaticWebAssets的构建目标被自动引入,但项目本身无Web资源,未生成对应清单文件
  • 构建参数不一致:Publish使用--no-build,但前置Build步骤未指定相同的-r win-x64参数,导致obj目录下无对应Runtime的构建产物

解决方案建议

1. 锁定.NET SDK版本

在项目根目录添加global.json指定使用.NET6 SDK:

{
  "sdk": {
    "version": "6.0.x",
    "rollForward": "latestPatch"
  }
}

同时在Pipeline中添加任务确保安装指定版本:

- task: UseDotNet@2
  displayName: 'Install .NET 6 SDK'
  inputs:
    packageType: 'sdk'
    version: '6.0.x'

2. 禁用StaticWebAssets生成

由于项目并非Web应用,直接在csproj中关闭StaticWebAssets构建逻辑:

<PropertyGroup>
  <EnableStaticWebAssets>false</EnableStaticWebAssets>
</PropertyGroup>

3. 统一Build与Publish的Runtime参数

修改Build任务,传入与Publish一致的RuntimeIdentifier,确保构建产物对应目标平台:

- task: DotNetCoreCLI@2
  displayName: Build
  inputs:
    command: build
    projects: '${{Parameters.buildProjects}}'
    arguments: '--configuration Release -r ${{Parameters.runtimeIdentifier}} --no-restore'

4. 清理构建缓存

在Pipeline开头添加清理任务,避免旧构建产物干扰:

- task: CmdLine@2
  displayName: 'Clean build artifacts'
  inputs:
    script: 'dotnet clean --configuration Release && rmdir /s /q obj bin'

内容的提问来源于stack exchange,提问作者Vincent Vega

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:02:34