Azure DevOps:“rzc generate exited with code 2”
Azure DevOps: “rzc generate exited with code 2”
我有一个 ASP.NET 核心 3.x 项目,它是使用 Azure DevOps Pipelines 构建和部署的。将项目升级为使用 C# 9.0 之后——但 不是 ASP.NET Core 5.0——我的 dotnet build
(DotNetCoreCLI@2
) 任务警告:
Unknown C# language version 9.0.
错误
警告后,任务立即失败并出现以下错误:
##[error]C:\Program Files\dotnet\sdk.1.404\Sdks\Microsoft.NET.Sdk.Razor\build\netstandard2.0\Microsoft.NET.Sdk.Razor.CodeGeneration.targets(150,5): Error : rzc generate exited with code 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 class 库,一切都会正常构建。
- 如果我将
DotNetCoreCLI@2
任务替换为 VSBuild@1
任务,一切也会正常构建。
鉴于此,仅当项目满足以下条件所有时才会出现此问题:
- 该项目使用
Microsoft.NET.Sdk.Web
或 Microsoft.NET.Sdk.Razor
SDK。
- 该项目使用
netcoreapp3.0
或 netcoreapp3.1
的 TargetFramework
。
- 该项目使用
LangVersion
个 9.0
。
- 该项目是使用 Azure DevOps
DotNetCoreCLI@2
任务构建的。
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<LangVersion>9.0</LangVersion>
</PropertyGroup>
</Project>
知道如何解决这个问题吗?
此问题并非特定于 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,因此可以通过将 Use .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 核心 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,它仍然没有必要。
我有和你一样的 issue/error,除了做 docker build
的时候。一切都在本地构建良好,但 docker build
因您提到的两个相同错误而失败。基于你 ,我更改了 docker 基本图像:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
至
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS backend
现在 docker build
工作正常。
Note: I'm still using .NET Core 3.1 in the code base; all I did was upgrade the build image.
我有一个 ASP.NET 核心 3.x 项目,它是使用 Azure DevOps Pipelines 构建和部署的。将项目升级为使用 C# 9.0 之后——但 不是 ASP.NET Core 5.0——我的 dotnet build
(DotNetCoreCLI@2
) 任务警告:
Unknown C# language version 9.0.
错误
警告后,任务立即失败并出现以下错误:
##[error]C:\Program Files\dotnet\sdk.1.404\Sdks\Microsoft.NET.Sdk.Razor\build\netstandard2.0\Microsoft.NET.Sdk.Razor.CodeGeneration.targets(150,5): Error : rzc generate exited with code 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 class 库,一切都会正常构建。
- 如果我将
DotNetCoreCLI@2
任务替换为VSBuild@1
任务,一切也会正常构建。
鉴于此,仅当项目满足以下条件所有时才会出现此问题:
- 该项目使用
Microsoft.NET.Sdk.Web
或Microsoft.NET.Sdk.Razor
SDK。 - 该项目使用
netcoreapp3.0
或netcoreapp3.1
的TargetFramework
。 - 该项目使用
LangVersion
个9.0
。 - 该项目是使用 Azure DevOps
DotNetCoreCLI@2
任务构建的。
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<LangVersion>9.0</LangVersion>
</PropertyGroup>
</Project>
知道如何解决这个问题吗?
此问题并非特定于 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,因此可以通过将 Use .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 核心 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,它仍然没有必要。
我有和你一样的 issue/error,除了做 docker build
的时候。一切都在本地构建良好,但 docker build
因您提到的两个相同错误而失败。基于你
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
至
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS backend
现在 docker build
工作正常。
Note: I'm still using .NET Core 3.1 in the code base; all I did was upgrade the build image.