我有一个面向.NET Standard 2.0的库。为了验证兼容性,我想使用.NET Core的当前和长期支持(LTS(版本运行单元测试。当这个问题被写出来的时候,它们是:
目标框架名称对象(TFM( | |
---|---|
.NET 5.0(当前( | net5.0 |
.NET Core 3.1(LTS( | netcoreapp3.1 |
.NET Core 2.1(LTS( | netcoreapp2.1 |
虽然最新的dotnet SDK可以针对任何以前的SDK版本,但dotnet test
需要特定的dotnet运行时。有很多方法可以将dotnet-sdk/运行时安装到基本docker映像中,但最简单的方法是从现有的基本映像中复制sdk和/或运行时。下面是dotnet6的一个例子,如果您需要dotnet5.0运行时进行单元测试:
FROM mcr.microsoft.com/dotnet/sdk:6.0 as build
#uncomment if you need the 5.0 SDK also (unlikely):
#COPY --from=mcr.microsoft.com/dotnet/sdk:5.0 /usr/share/dotnet/sdk /usr/share/dotnet/sdk
# "install" the dotnet 5 runtime
COPY --from=mcr.microsoft.com/dotnet/sdk:5.0 /usr/share/dotnet/shared /usr/share/dotnet/shared
如果你运行上面的图像,进入外壳并执行dotnet --info
,它就像预期的那样:
$ docker run -it --rm 0de6f2cdf814
root@b4bb146dcf7e:/src# dotnet --info
.NET SDK (reflecting any global.json):
Version: 6.0.200
Commit: 4c30de7899
Runtime Environment:
OS Name: debian
OS Version: 11
OS Platform: Linux
RID: debian.11-x64
Base Path: /usr/share/dotnet/sdk/6.0.200/
Host (useful for support):
Version: 6.0.2
Commit: 839cdfb0ec
.NET SDKs installed:
6.0.200 [/usr/share/dotnet/sdk]
.NET runtimes installed:
Microsoft.AspNetCore.App 5.0.10 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 6.0.2 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 5.0.10 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 6.0.2 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
To install additional .NET runtimes or SDKs:
https://aka.ms/dotnet-download
root@b4bb146dcf7e:/src#
只需将Docker映像用于最新的.NET版本(当前为mcr.microsoft.com/dotnet/sdk:5.0
(。它能够构建针对不同版本的项目。这与您在开发机器上本地执行此操作的方式相同。您只需在机器上安装5.0 SDK,即可构建针对2.1、3.1或5.0的项目。
如果您想在同一个容器中运行单元测试,则需要为5.0以外的每个版本安装所需的额外运行时。这将根据您的目标操作系统而有所不同,但您可以在https://learn.microsoft.com/en-us/dotnet/core/install/.例如,在Debian上,您可以安装带有以下内容的ASP.NET 3.1运行时:
wget https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -O packages-microsoft-prod.deb &&
dpkg -i packages-microsoft-prod.deb &&
apt-get update &&
apt-get install -y apt-transport-https &&
apt-get update &&
apt-get install -y aspnetcore-runtime-3.1
我试图避免构建自定义映像和编写额外的运行时脚本,所以我的变体是在多个容器(sdk:2.1
、sdk:3.1
(上分别运行构建/测试。
有趣的是,有多目标:
<PropertyGroup>
<TargetFrameworks>netcoreapp2.1;netcoreapp3.1</TargetFrameworks>
</PropertyGroup>
不允许在sdk:2.1
容器上生成,即使您指定只想使用参数-f netcoreapp2.1
为2.1
生成。
我最终得到了条件csproj
文件,它根据外部参数指定了TargetFrameworks
。例如,我的csproj
配置是:
<TargetFrameworks Condition=" '$(TestTargetFramework)' == '' ">netstandard2.0;netstandard2.1</TargetFrameworks>
<TargetFrameworks Condition=" '$(TestTargetFramework)' == 'netcoreapp2.1' ">netstandard2.0</TargetFrameworks>
<TargetFrameworks Condition=" '$(TestTargetFramework)' == 'netcoreapp3.1' ">netstandard2.1</TargetFrameworks>
我可以在sdk:2.1
:上构建/测试它
dotnet test ./test/Tests --configuration Release /p:TestTargetFramework=netcoreapp2.1
或sdk:3.1
:
dotnet test ./test/Tests --configuration Release /p:TestTargetFramework=netcoreapp3.1