为什么包含renv的R包在CircleCI中构建失败并提示devtools缺失?
问题原因
- renv在项目中激活后,默认会启用包隔离机制,仅读取项目
renv/library路径下的R包,不会加载镜像中全局安装的系统包 - 你的自定义镜像将devtools安装在R的全局系统库中,renv激活后包搜索路径默认不包含全局库路径,因此调用
devtools::install_deps时会触发找不到包的错误 - 无renv配置时R会默认读取全局系统库,因此运行流程正常。
解决方案
你可以根据自己的使用场景选择以下任意一种方案:
方案1:临时禁用renv激活,使用全局devtools安装依赖
适合不需要在CI的依赖安装步骤使用renv环境的场景,仅需修改CI配置中依赖安装的命令,临时关闭renv自动激活即可:
version: 2 jobs: build: docker: - image: my_random_image steps: - checkout - run: name: Install package dependencies command: R -e "Sys.setenv(RENV_ACTIVATE_PROJECT = FALSE); devtools::install_deps(dep = TRUE)" - run: name: Build package command: R CMD build . - run: name: Check package command: R CMD check *tar.gz
方案2:将devtools加入项目renv依赖
适合需要在CI全流程使用renv环境的场景,在本地开发环境的项目目录下执行以下命令,将devtools加入renv锁文件后提交代码即可:
renv::install("devtools") renv::snapshot()
提交更新后的renv.lock文件到仓库后,CI流程中renv激活后就可以直接读取到项目库中的devtools。
方案3:调整renv配置允许访问全局系统库
不需要修改锁文件,仅需在依赖安装步骤前添加renv配置项,允许renv搜索全局系统库即可:
options(renv.config.system.library = TRUE) devtools::install_deps(dep = TRUE)
对应修改后的CI命令为:
command: R -e "options(renv.config.system.library = TRUE); devtools::install_deps(dep = TRUE)"
内容的提问来源于stack exchange,提问作者Jacky
相关产品推荐
相关产品推荐

