docker - 如何从单个 Docker 映像定位多个 .NET Core 版本?
问题描述
我有一个针对.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 |
将 csproj 文件设置为针对多个框架很容易:
<PropertyGroup>
<TargetFrameworks>netcoreapp2.1;netcoreapp3.1;net5.0</TargetFrameworks>
</PropertyGroup>
当安装了所有这些 SDK 时,这适用于本地构建。但是,我更愿意在单个轻量级 Docker 容器上进行 CI 构建。我不担心验证 .NET Framework 支持,所以我不需要 Windows。Docker Hub 上的.NET SDK 映像适用于任何单一框架(即mcr.microsoft.com/dotnet/sdk:5.0),但我想找到一个包含所有这三个 SDK 的 Docker 映像,而没有类似于GitHub 托管的 runners的“厨房水槽”图像,其中包括许多不相关的框架和工具。
我可以编写自己的Dockerfile,从基础映像开始编写额外 SDK 的安装脚本,但我肯定不能是唯一可以使用这样的东西的人。某个地方是否已经存在合适的 Docker 映像?我是否应该对这个问题采取不同的方法,例如使用setup-dotnet或等效方法编写 SDK 安装脚本?
解决方案
我试图避免构建自定义图像和编写额外的运行时脚本,所以我的变体是分别在多个容器 ( , ) 上运行构建sdk:2.1
/sdk:3.1
测试。
有趣的是,拥有多目标:
<PropertyGroup>
<TargetFrameworks>netcoreapp2.1;netcoreapp3.1</TargetFrameworks>
</PropertyGroup>
不允许在sdk:2.1
容器上构建,即使您指定您只想为 构建2.1
,使用参数-f netcoreapp2.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
推荐阅读
- odoo - 添加或删除行时更新所有 One2many 行中的字段
- batch-file - 在 npm 脚本中运行批处理文件
- python-3.x - 无法理解 tf.nn.raw_rnn
- apache-spark - 使用 Spark 展平滑动窗口中的行
- python - 通过 POST 请求发送数据
- watson - 从 IBM Watson Discovery 获得准确答案
- css - Flexbox - 右侧的图像
- git - 是否可以在没有 push --force 的情况下压缩和重命名远程存储库上的 git 提交
- html - Obj-C 和 Swift 之间返回的 Web 内容不同
- codenameone - 代号一 - 自定义未选中的 PickerComponent 的文本