我有一个当前支持 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 }}
不使用指定的框架进行恢复。
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
test csproj中的
<TargetFrameworks>
标签来选择应测试的 .net 版本。测试运行器将运行其中列出的每个 .net 版本中的每个测试。这对于我迄今为止见过的每个项目来说已经足够了。
如果您真的想要测试,就像您起草的那样,使用测试矩阵来确保对缺乏 SDK 的支持/通过测试,您的方法似乎是合理的。我在您的 GHA 工作流程中修复的问题:
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"
您可以使用
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 }}