You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在多R包单体仓库子目录配置GitHub Actions的方案问询

多R包单仓库的GitHub Actions配置与usethis工具使用方案

问题描述

我平时编写R包时,习惯用usethis::use_github_actions()在仓库根目录创建.github/目录配置CI(持续集成)。现有一个遗留仓库,其/R目录下包含多个R包,其他目录还存有Python应用等内容,希望为每个R包单独配置持续集成,且无需将各包迁移至独立仓库。请问如何配置GitHub Actions工作流以分别检查/R目录下的每个R包?此类仓库结构下,能否使用usethis工具创建徽章、pkgdown网站等?


一、配置GitHub Actions实现多R包独立CI

1. 静态指定包的工作流方案

在仓库根目录的.github/workflows/下创建r-package-checks.yml文件,利用矩阵策略(matrix)为每个R包单独执行CI检查:

name: 多R包持续集成检查

on:
  push:
    paths:
      - "R/**"
  pull_request:
    paths:
      - "R/**"

jobs:
  check-package:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        package: ["scales", "roxygen2"] # 对应/R下的包目录名称
        r-version: ["release"]

    steps:
      - name: 拉取仓库代码
        uses: actions/checkout@v4

      - name: 配置R环境
        uses: r-lib/actions/setup-r@v2
        with:
          r-version: ${{ matrix.r-version }}

      - name: 安装包依赖
        uses: r-lib/actions/setup-r-dependencies@v2
        with:
          working-directory: ./R/${{ matrix.package }}
          extra-packages: any::rcmdcheck
          needs: check

      - name: 执行R包检查
        uses: r-lib/actions/check-r-package@v2
        with:
          working-directory: ./R/${{ matrix.package }}

2. 动态遍历包目录的自动化方案

如果/R下的包数量较多或会新增,可通过前置任务自动识别所有包目录,无需手动维护矩阵列表:

name: 动态多R包CI检查

on: [push, pull_request]

jobs:
  discover-packages:
    runs-on: ubuntu-latest
    outputs:
      packages: ${{ steps.set-packages.outputs.packages }}
    steps:
      - uses: actions/checkout@v4
      - id: set-packages
        run: |
          # 遍历/R下的所有子目录(排除/R本身),转为JSON格式传递给矩阵
          PACKAGES=$(find R -maxdepth 1 -type d | grep -v "^R$" | sed 's/R\///' | jq -R . | jq -s .)
          echo "packages=$PACKAGES" >> $GITHUB_OUTPUT

  check-package:
    needs: discover-packages
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        package: ${{ fromJson(needs.discover-packages.outputs.packages) }}
        r-version: ["release"]

    steps:
      - name: 拉取仓库代码
        uses: actions/checkout@v4

      - name: 配置R环境
        uses: r-lib/actions/setup-r@v2
        with:
          r-version: ${{ matrix.r-version }}

      - name: 安装包依赖
        uses: r-lib/actions/setup-r-dependencies@v2
        with:
          working-directory: ./R/${{ matrix.package }}
          extra-packages: any::rcmdcheck
          needs: check

      - name: 执行R包检查
        uses: r-lib/actions/check-r-package@v2
        with:
          working-directory: ./R/${{ matrix.package }}

二、usethis工具的适配使用

1. 创建CI徽章

usethis支持为单个包添加徽章,但需先切换到对应包的目录并设置项目上下文:

# 进入目标包目录后执行
usethis::proj_set("./R/scales") # 替换为你的包路径
# 从GitHub Actions工作流页面复制对应包的徽章URL,填入下方
usethis::use_badge("CI", "https://github.com/<你的用户名>/<仓库名>/actions/workflows/r-package-checks.yml/badge.svg?package=scales")

2. 构建pkgdown网站

可为每个R包单独构建pkgdown网站,步骤如下:

  1. 切换到包目录,初始化pkgdown配置:
usethis::proj_set("./R/scales")
usethis::use_pkgdown()
  1. 在GitHub Actions工作流中添加pkgdown构建步骤(可插入到包检查步骤之后):
- name: 构建pkgdown网站
  uses: r-lib/actions/pkgdown@v2
  with:
    working-directory: ./R/${{ matrix.package }}
  env:
    GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}

部署时可将每个包的pkgdown输出目录指定为根目录的docs/<包名>,再配置GitHub Pages从docs目录读取,访问路径为https://<用户名>.github.io/<仓库名>/<包名>。


复现示例的macOS Shell命令

mkdir example_repo
cd example_repo
git clone https://github.com/r-lib/scales.git
git clone https://github.com/r-lib/roxygen2
cd roxygen2
rm -rf .git
cd ../scales
rm -rf .git

内容的提问来源于stack exchange,提问作者Michael Roswell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:01:14