首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >github动作矩阵中的配对值

github动作矩阵中的配对值
EN

Stack Overflow用户
提问于 2021-02-03 10:03:31
回答 2查看 3.2K关注 0票数 17

我想针对一个C和C++项目的三个编译器版本进行构建: gcc、gcc-8和clang (用于C编译器),它应该分别使用g++、g++-8和clang++作为C++编译器。

总共有3种配置。我不想用所有C和C++编译器版本的产品来构建,即。没有gcc/g++-8等。

如何使用这三种配置指定一个矩阵,每个配置设置两个变量?

目前我正在使用这个(请注意,指定了2个OSes,因此总共有6个信任):

代码语言:javascript
复制
    strategy:
      matrix:
        os: [ubuntu-16.04, ubuntu-latest]
        cpp_compiler: [g++, g++-8, clang++]
        include:
          - c_compiler: gcc
          - cpp_ompiler: g++-8
            c_compiler: gcc-8
          - cpp_compiler: clang++
            c_compiler: clang

本质上,C++编译器(cpp_compiler)被用作主版本,然后include以黑客的方式根据cpp_compiler版本设置c_compiler,但是必须有更好的.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-26 14:04:52

除了将@jidicula的答复存储为arraymatrix之外,您还可以将其存储为map,这将使工作流更具可读性。

因此,下面的工作流应该工作得更漂亮一些:

代码语言:javascript
复制
# simplified

strategy:
  matrix:
    os: [ubuntu-16.04, ubuntu-latest]
    compiler: [ {cpp: g++, c: gcc}, {cpp: g++-8, c: gcc-8}, {cpp: clang++, c: clang} ]
steps:
  - name: Compile with C++ compiler
    run: ${{ matrix.compiler.cpp }} source.cpp
  - name: Compile with C compiler
    run: ${{ matrix.compiler.c }} source.c

当触发此工作流时,它将与不同的matrix并行执行6次。

代码语言:javascript
复制
1: matrix.os == ubuntu-16.04, matrix.compiler.cpp == g++, matrix.compiler.c == gcc
2: matrix.os == ubuntu-16.04, matrix.compiler.cpp == g++-8, matrix.compiler.c == gcc-8
3: matrix.os == ubuntu-16.04, matrix.compiler.cpp == clang++, matrix.compiler.c == clang
4: matrix.os == ubuntu-latest, matrix.compiler.cpp == g++, matrix.compiler.c == gcc
5: matrix.os == ubuntu-latest, matrix.compiler.cpp == g++-8, matrix.compiler.c == gcc-8
6: matrix.os == ubuntu-latest, matrix.compiler.cpp == clang++, matrix.compiler.c == clang

但是,无论是array还是map,语法目前都是无文档化的,尽管语法检查器已不再将其标记为错误。因此,所有这些都可能在未来发生改变。

票数 24
EN

Stack Overflow用户

发布于 2021-02-09 02:50:13

我只是尝试了一下,结果发现你可以在一个构建矩阵中嵌套数组,但是它是没有文档的。因此,您可以在job.matrix中创建一个编译器数组数组。让我们称之为compiler-versioncompiler-version: [[g++, gcc], [g++-8, gcc-8], [clang++, clang]]。然后,您可以使用零索引访问compiler-version数组的每个元素中的每个值:matrix.compiler-version[0]用于C++编译器,matrix.compiler-version[1]用于其C对应项。

您的工作流程将变成:

代码语言:javascript
复制
    strategy:
      matrix:
        os: [ubuntu-16.04, ubuntu-latest]
        compiler-version: [[g++, gcc], [g++-8, gcc-8], [clang++, clang]]
    steps:
      # .... checkout steps
      - name: Compile file with C++ compiler
        env:
          COMPILER: ${{ matrix.compiler-version[0] }}
        run: |
          $COMPILER file.c
          ./a.out
      - name: Compile file with C compiler
        env:
          COMPILER: ${{ matrix.compiler-version[1] }}
        run: |
          $COMPILER file.c
          ./a.out

我用两个Python版本和两个Ubuntu版本组成了一个最小的例子,其中3.7与Ubuntu-18.04配对,3.8与Ubuntu-20.04配对。您可以看到工作流文件这里及其相应的运行这里

该解决方案克服了在工作流文件中的两个位置定义C++选项的尴尬之处。尽管没有文档化,但我认为它是稳定的,因为GitHub操作上下文对象是(或者至少像对待) JavaScript对象,所以我们实际上只是将数组文本定义为矩阵对象属性并访问它们的值。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66025220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档