使用 VS 2017 图像,无法在具有一个 .NET Core 3 项目的解决方案中构建其​​他项目

Using VS 2017 image, unable to build other projects in a solution which has one .NET Core 3 project

我有一个包含多个项目的解决方案,其中一个针对 .NET Core 3。

我需要使用 VS 2019 图像和 2017 图像在解决方案中构建另一个项目。对于 2017 年的图像,我不需要构建 .NET Core 项目;所以我使用 VS 配置管理器禁用了该项目的构建。但是,构建仍然失败:

C:\Program Files\dotnet\sdk.2.108\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.TargetFrameworkInference.targets(137,5): error NETSDK1045: The current .NET SDK does not support targeting .NET Core 3.0. Either target .NET Core 2.2 or lower, or use a version of the .NET SDK that supports .NET Core 3.0. [C:\projects\antlr4parsetreevisualizer_visualizerTestCore_visualizerTestCore.csproj]

因为那个项目。

在这种情况下,我如何告诉 AppVeyor 忽略该项目?

我尝试明确设置 build: project: element,但无济于事。

appveyor.yml

我们将在下一次更新 (https://github.com/appveyor/ci/issues/3158) 中将 .NET Core 3.0 添加到 Visual Studio 2017 映像中。同时,您可以在构建过程中使用以下脚本安装.NET Core 3.0:

install:
- ps: Invoke-WebRequest -Uri 'https://dot.net/v1/dotnet-install.ps1' -UseBasicParsing -OutFile "$env:temp\dotnet-install.ps1"
- ps: '& $env:temp\dotnet-install.ps1 -Architecture x64 -Version "3.0.100" -InstallDir "$env:ProgramFiles\dotnet"'

关于项目排除 - 我相信您可以在 Visual Studio IDE ("Configuration manager...") 中禁用特定配置的项目构建。但是,对于 .NET Core 项目,我建议从构建解决方案转向使用 dotnet build ... 构建特定项目。此外,如果您需要发布 .NET Core 应用程序,发布解决方案将无法使用 dotnet publish 命令。

最初,每个配置我只有一个 .csproj 文件要构建。每个构建图像,我将项目传递给 dotnet restore(在我的例子中,我还必须重新设计矩阵逻辑以依赖于 appveyor_build_worker_image 环境变量):

environment:
  matrix:

  - job_name: VS 2019 build
    appveyor_build_worker_image: Visual Studio 2019

  - job_name: VS 2017 build
    appveyor_build_worker_image: Visual Studio 2017

# ...

for:

# ...
- 
  matrix:
    only:
      - appveyor_build_worker_image: Visual Studio 2017

  configuration: ReleaseCI2017
  build:
    project: 201717.csproj
  before_build:
    - cmd: dotnet restore 201717.csproj

一旦我这样做了,everything seems to work,即使没有在 install 脚本中下载和安装 .NET Core 3。

appveyor.yml

Thread on AppVeyor support forum


但事实证明,我需要为每个图像构建两个项目。我已经通过使用额外的解决方案文件来控制应该在每个图像下构建哪些项目来解决这个问题,而不是依赖于 VS 配置管理器。

然后我将每个解决方案传递给 build: project 元素,AppVeyor 将只尝试构建该解决方案引用的特定项目。

appveyor.yml

AppVeyor log.