【问题标题】:Azure DevOps: “rzc generate exited with code 2”Azure DevOps:“rzc generate exited with code 2”
【发布时间】:2021-03-08 20:45:03
【问题描述】:

我有一个使用 Azure DevOps Pipelines 构建和部署的 ASP.NET Core 3.x 项目。在将项目升级为使用 C# 9.0(但不是 ASP.NET Core 5.0)后,我的dotnet build (DotNetCoreCLI@2) 任务发出警告:

未知的 C# 语言版本 9.0。

错误

警告后,任务立即失败并出现以下错误:

##[错误]C:\Program Files\dotnet\sdk\3.1.404\Sdks\Microsoft.NET.Sdk.Razor\build\netstandard2.0\Microsoft.NET.Sdk.Razor.CodeGeneration.targets( 150,5):错误:rzc 生成退出,代码为 2。

任务

我的构建任务没有什么特别之处,只是为了完整性:

- task: DotNetCoreCLI@2
  displayName: 'dotnet build'
  inputs:
    projects: '*.sln'
    arguments: '/p:configuration=$(BuildConfiguration) --no-restore'

条件

值得注意的是:

  • 在我的本地计算机上使用 dotnet build 可以正常构建项目。
  • 如果我删除 ASP.NET Core 3.x 项目,只留下我的 .NET Core 3.x 类库,一切正常。
  • 如果我将 DotNetCoreCLI@2 任务替换为 VSBuild@1 任务,一切都会正常运行。

鉴于此,仅当项目满足以下条件所有时才会出现此问题:

  • 该项目使用Microsoft.NET.Sdk.WebMicrosoft.NET.Sdk.Razor SDK。
  • 该项目使用TargetFrameworknetcoreapp3.0netcoreapp3.1
  • 该项目使用LangVersion9.0
  • 该项目是使用 Azure DevOps DotNetCoreCLI@2 任务构建的。
<Project Sdk="Microsoft.NET.Sdk.Razor">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <LangVersion>9.0</LangVersion>
  </PropertyGroup>
</Project>

知道如何解决这个问题吗?

【问题讨论】:

    标签: asp.net-core azure-pipelines asp.net-core-3.1 razorgenerator c#-9.0


    【解决方案1】:

    此问题并非特定于 Azure DevOps Pipelines。相反,该问题似乎是由于 .NET 3.x SDK 中内置的 Razor 编译器与 C# 9.0 之间的不兼容所致。这需要 .NET 5.x SDK 的可用性,以便使用 Razor 视图和 C# 9.0 编译项目 - 即使该项目本身是 .NET 3.x 项目。

    Azure DevOps 管道

    由于此问题专门针对 Azure DevOps Pipelines,因此可以通过将使用 .NET Core SDK 任务显式添加到您的管道并使用 .NET 5.x SDK 对其进行配置来解决此问题:

    - task: UseDotNet@2
      displayName: 'Use .NET Core SDK 5.x'
      inputs:
        version: 5.x
        includePreviewVersions: true
    

    备注

    • 即使 .NET 5 已发布,您目前仍必须设置 includePreviewVersions

    • .NET 5 SDK 仍然可以构建项目,尽管它是一个 ASP.NET Core 3.x 项目。

    • 管道中的其他任务(例如 gitversion,在我的例子中)可能显式依赖于 .NET Core 3.x SDK;如果是这样,您还需要安装它:

      steps:
      - task: UseDotNet@2
        displayName: 'Use .NET Core SDK 3.x'
        inputs:
          version: 3.x
      

    如果您已将项目升级为使用 .NET 5.0 和 ASP.NET Core 5.0,此步骤可能很明显,但如果您仍在使用 .NET 3.x 并且仅升级到 C# 9.0,则可能不明显——事实上,如果你的 .NET 项目不需要编译 Razor,它仍然没有必要。

    【讨论】:

    • 请告诉我您在哪里输入您显示的文本示例。我遇到了同样的错误,但它指向 .csproj 文件,我看不到/找出问题所在。
    • @EoRaptor013:此文本位于我的 Azure Pipeline 的 YAML 中。该错误可能仍指向您的csproj,因为它将在构建时遇到问题。但根本问题是必须安装 .NET 5 才能使用 C# 9.0 编译 ASP.NET Core 3.x 项目或带有视图的 Razor 类库。如果您不使用 Azure Pipelines,只需确保在进行构建的机器上安装了 .NET 5。
    • 谢谢!我没有 yaml 管道,因为这是一个直接的本地 Web 项目。但是,我确实在 csproj 文件中找到了对 Razor 的引用。这里没有使用 Razor,所以不知道为什么会有这条线。删除该行,一切都很好。
    【解决方案2】:

    我遇到了和你一样的问题/错误,除了docker build。一切都在本地构建良好,但 docker build 因您提到的同样的两个错误而失败。基于你 your answer about .NET 5,我将 docker 基础镜像从:

    FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
    

    FROM mcr.microsoft.com/dotnet/sdk:5.0 AS backend
    

    docker build 现在可以正常工作了。

    注意:我仍在代码库中使用 .NET Core 3.1;我所做的只是升级构建映像。

    【讨论】:

    • 哦,这很有趣。这很有意义。我想在开发人员工作站上,更有可能为从事此类项目的人安装 .NET Core 3 和 .NET 5,但不一定在虚拟机上——通过 Docker 清单或 CI/CD管道实例。
    猜你喜欢
    • 2019-09-25
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    相关资源
    最近更新 更多