如何在 CI 中恢复 dotnet 的多目标框架以使用旧版本的 dotnet 进行测试?

问题描述 投票:0回答:3

我有一个当前支持 dotnet 8 的 C# 包,我正在尝试修改它以添加 dotnet 6 和 7 支持。我已经在我的笔记本电脑上本地使用 dotnet 8 为所有版本构建了它,在

<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
文件中使用
.csproj
并删除了 net6.0 之后添加的所有 C# 功能。然而,当我将其推送到 GitHub 并且我的工作流程在 Github Actions 中运行时,我针对 dotnet 6、7 以及 8 对其进行了测试,并且它在
dotnet restore
步骤中中断。

我的工作流程:

name: .NET

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

env:
  DOTNET_CLI_TELEMETRY_OPTOUT: true
  DOTNET_GENERATE_ASPNET_CERTIFICATE: false

jobs:
  build:

    runs-on: macos-latest
    name: .NET ${{ matrix.dotnet }}
    strategy:
      matrix:
        dotnet:
          - 8.0 # EOL: 2026-11-10
          - 7.0 # EOL: 2024-05-14
          - 6.0 # EOL: 2024-11-12
          # version support doc: https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core
    steps:
    - uses: actions/checkout@v3
      with:
        repository: getargv/getargv
        path: getargv
        token: ${{ secrets.GH_PAT }}
    - name: Build libgetargv
      run: make install_dylib
      working-directory: getargv
    - uses: actions/checkout@v3
      with:
        path: getargv.cs
    - name: Setup .NET
      uses: actions/setup-dotnet@v4
      id: setup
      with:
        dotnet-version: ${{ matrix.dotnet }}.x
    - name: Create temporary global.json
      run: "echo '{\"sdk\":{\"version\": \"${{ steps.setup.outputs.dotnet-version }}\"}}' > ./global.json"
      working-directory: getargv.cs
    - name: Restore dependencies
      run: dotnet restore
      working-directory: getargv.cs
    - name: Build
      run: dotnet build --no-restore --framework net${{ matrix.dotnet }}
      working-directory: getargv.cs
    - name: Test
      run: dotnet test --no-build --verbosity normal
      working-directory: getargv.cs

我可以在使用标志构建时设置框架,但恢复步骤没有这样的标志。

我得到的错误是相当可预测的:

Error: /Users/runner/.dotnet/sdk/7.0.404/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(160,5): error NETSDK1045: The current .NET SDK does not support targeting .NET 8.0.  Either target .NET 7.0 or lower, or use a version of the .NET SDK that supports .NET 8.0. Download the .NET SDK from https://aka.ms/dotnet/download [/Users/runner/work/getargv.cs/getargv.cs/getargv.cs/Getargv/Getargv.csproj::TargetFramework=net8.0]
Error: /Users/runner/.dotnet/sdk/7.0.404/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(160,5): error NETSDK1045: The current .NET SDK does not support targeting .NET 8.0.  Either target .NET 7.0 or lower, or use a version of the .NET SDK that supports .NET 8.0. Download the .NET SDK from https://aka.ms/dotnet/download [/Users/runner/work/getargv.cs/getargv.cs/getargv.cs/Getargv.Tool/Getargv.Tool.csproj::TargetFramework=net8.0]
Error: /Users/runner/.dotnet/sdk/7.0.404/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(160,5): error NETSDK1045: The current .NET SDK does not support targeting .NET 8.0.  Either target .NET 7.0 or lower, or use a version of the .NET SDK that supports .NET 8.0. Download the .NET SDK from https://aka.ms/dotnet/download [/Users/runner/work/getargv.cs/getargv.cs/getargv.cs/Getargv.Tests/Getargv.Tests.csproj::TargetFramework=net8.0]
Error: /Users/runner/.dotnet/sdk/6.0.417/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(144,5): error NETSDK1045: The current .NET SDK does not support targeting .NET 7.0.  Either target .NET 6.0 or lower, or use a version of the .NET SDK that supports .NET 7.0. [/Users/runner/work/getargv.cs/getargv.cs/getargv.cs/Getargv/Getargv.csproj]
Error: /Users/runner/.dotnet/sdk/6.0.417/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(144,5): error NETSDK1045: The current .NET SDK does not support targeting .NET 7.0.  Either target .NET 6.0 or lower, or use a version of the .NET SDK that supports .NET 7.0. [/Users/runner/work/getargv.cs/getargv.cs/getargv.cs/Getargv.Tool/Getargv.Tool.csproj]
Error: /Users/runner/.dotnet/sdk/6.0.417/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(144,5): error NETSDK1045: The current .NET SDK does not support targeting .NET 7.0.  Either target .NET 6.0 or lower, or use a version of the .NET SDK that supports .NET 7.0. [/Users/runner/work/getargv.cs/getargv.cs/getargv.cs/Getargv.Tests/Getargv.Tests.csproj]

人们如何在支持较新版本的同时对旧版 dotnet 版本进行测试?

编辑:

将构建命令更改为:

dotnet build --framework net${{ matrix.dotnet }}
不使用指定的框架进行恢复。

c# testing github-actions nuget-package-restore multitargeting
3个回答
0
投票
dotnet --version # Check the installed versions
dotnet --list-sdks # List all installed SDKs
dotnet --global install "desired_version" # Install the desired version

指定 .NET SDK 版本后,为您的多目标框架项目执行 dotnet Restore 命令。此命令将恢复您的项目所需的 NuGet 包。

# Navigate to your project directory
cd path/to/your/project

dotnet restore

恢复包后,您可以使用 dotnet test 命令运行测试。这假设您已经为您的项目设置了单元测试。

dotnet test

确保根据您的项目要求调整版本号和路径。

示例:

# Install .NET SDK 7.0.404
dotnet --global install 7.0.404

# Navigate to your project directory
cd path/to/your/project

# Restore packages
dotnet restore

# Run tests
dotnet test

0
投票

常见的 Github Actions 方法:

  1. 安装所有目标SDK
  2. 使用
    test csproj
    中的 <TargetFrameworks> 标签来选择应测试的 .net 版本。测试运行器将运行其中列出的每个 .net 版本中的每个测试。

这对于我迄今为止见过的每个项目来说已经足够了。

测试矩阵方法

如果您真的想要测试,就像您起草的那样,使用测试矩阵来确保对缺乏 SDK 的支持/通过测试,您的方法似乎是合理的。我在您的 GHA 工作流程中修复的问题:

  1. 在这个POC中,矩阵值的格式似乎变得混乱 - >避免“。”在版本中。
  2. 您需要在运行测试时选择 .net 版本。
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        dotnet: [8, 7, 6]
    steps:
    - uses: actions/checkout@v4
    - name: Setup .NET
      uses: actions/setup-dotnet@v4
      with:
        dotnet-version: ${{ matrix.dotnet }}.0.x
    - name: Restore dependencies
      run: dotnet restore
    - name: Build
      run: dotnet build --configuration Release --no-restore --framework net${{ matrix.dotnet }}.0
    - name: Test
      run: dotnet test --no-build --verbosity normal --configuration Release --framework net${{ matrix.dotnet }}.0

免责声明

我跳过了 Directory.Build.props 中 global.json 和 sdk 固定的复杂性。无论如何,如果显式安装/省略 SDK 版本,这实际上没有意义。并且global.json中的设置与过去的NETSDK1045有关。

一个不会失败的起点(添加了latestMajor)是例如:

    - name: Create temporary global.json
      run: "echo '{\"sdk\":{\"version\": \"${{ matrix.dotnet }}.0.0\" ,\"rollForward\": \"latestMajor\" }}' > ./global.json"

0
投票

您可以使用

dotnet restore -p:TargetFramework=net7.0
指定 dotnet 恢复的目标框架。

dotnet restore
dotnet build
dotnet msbuild
的包装,
dotnet restore
实际上与调用
dotnet msbuild -t:restore
相同。 一些其他信息可以在这个问题中找到。

我会尝试像这样更改你的代码:

    - name: Restore dependencies
      run: dotnet restore -p:TargetFramework=net${{ matrix.dotnet }}
© www.soinside.com 2019 - 2024. All rights reserved.