如何强制remotes::install_deps仅从二进制安装R依赖?
解决GitHub Actions中R依赖安装因源码编译失败的问题
问题背景
在GitHub Actions工作流中使用remotes::install_deps安装R依赖时,因curl包更新至5.0.2,但CRAN暂未提供对应二进制包,导致install_deps尝试源码编译该包,而运行机器未安装libcurl系统库,最终编译失败。需求是强制安装所有依赖的最新可用二进制包,无需追求绝对最新版本。此前设置options(install.packages.compile.from.source = "never")和options("pkgType" = "binary")未解决问题。
原工作流配置:
jobs: generate-data: runs-on: ${{ matrix.config.os }} name: ${{ matrix.config.os }} (${{ matrix.config.r }}) strategy: fail-fast: false matrix: config: - {os: ubuntu-latest, r: 'release'} env: R_REMOTES_NO_ERRORS_FROM_WARNINGS: true RSPM: ${{ matrix.config.rspm }} GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v2 - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} http-user-agent: ${{ matrix.config.http-user-agent }} use-public-rspm: true - uses: r-lib/actions/setup-pandoc@v2 - name: Query dependencies run: | install.packages('remotes') install.packages('sessioninfo') saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version") shell: Rscript {0} - name: Cache R packages uses: actions/cache@v1 with: path: ${{ env.R_LIBS_USER }} key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }} restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1- - name: Install dependencies run: | remotes::install_deps(dependencies = TRUE) shell: Rscript {0}
可行解决方案
方法1:强制使用RSPM二进制源
你已经启用了RSPM(RStudio Package Manager),它针对Ubuntu提供预编译二进制包。需确保依赖查询和安装都使用RSPM源,并禁止源码编译:
- 修改Query dependencies步骤,指定RSPM源查询依赖:
install.packages(c('remotes', 'sessioninfo'), repos = c(CRAN = Sys.getenv("RSPM"))) saveRDS(remotes::dev_package_deps(dependencies = TRUE, repos = c(CRAN = Sys.getenv("RSPM"))), ".github/depends.Rds", version = 2) writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version")
- 修改Install dependencies步骤,强制仅用二进制安装:
options(install.packages.compile.from.source = "never") options(pkgType = "binary") remotes::install_deps( dependencies = TRUE, repos = c(CRAN = Sys.getenv("RSPM")) )
方法2:锁定curl包版本
如果仅需解决curl的问题,可直接锁定其为有二进制包的5.0.1版本:
- 若项目有
DESCRIPTION文件,添加版本约束:
Imports: curl (>= 5.0.1, < 5.0.2)
- 或在安装依赖前手动指定版本安装:
remotes::install_version("curl", version = "5.0.1", repos = c(CRAN = Sys.getenv("RSPM"))) remotes::install_deps(dependencies = TRUE)
方法3:安装系统依赖(允许源码编译)
若可接受源码编译,可在安装R依赖前安装libcurl系统库:
在工作流中添加以下步骤:
- name: Install system dependencies if: runner.os == 'Linux' run: | sudo apt-get update sudo apt-get install -y libcurl4-openssl-dev
内容的提问来源于stack exchange,提问作者mikeblazanin
相关产品推荐
相关产品推荐

