1

我有一个使用 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任务,一切也都很好。

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

  • 该项目使用SDKMicrosoft.NET.Sdk.WebMicrosoft.NET.Sdk.RazorSDK。
  • 该项目使用一个TargetFramework或。netcoreapp3.0netcoreapp3.1
  • 该项目使用LangVersion.9.0
  • 该项目是使用 Azure DevOpsDotNetCoreCLI@2任务构建的。
<Project Sdk="Microsoft.NET.Sdk.Razor">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <LangVersion>9.0</LangVersion>
  </PropertyGroup>
</Project>

关于如何解决这个问题的任何想法?

4

2 回答 2

3

我遇到了和你一样的问题/错误,除了在做docker build. 一切都在本地构建良好,但因docker build您提到的同样的两个错误而失败。根据您对 .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;我所做的只是升级构建映像。

于 2021-01-26T20:55:38.830 回答
3

此问题并非特定于 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 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,它仍然没有必要。

于 2020-11-25T23:25:07.280 回答