关联GitHub后R包devtools::build与check_win_release运行变慢问题
问题原因分析
- 核心触发因素是关联Git仓库后devtools的默认行为变更:当检测到项目为Git仓库时,
devtools::build()和devtools::check_win_release()默认会自动在包版本号后追加Git commit哈希后缀,修改DESCRIPTION文件的修改时间,触发包的全量重编译流程,你场景中Stan相关C++代码的编译耗时就是等待的核心原因。 - 遗漏的忽略规则导致无关文件被纳入构建流程:你仅添加了README相关规则,未将
.git目录、Git配置文件、Stan编译临时产物等加入.Rbuildignore,构建时会额外扫描大量无关文件拖慢流程,甚至会因文件时间戳变更误判代码需要重编译。 - 帮助页面处理逻辑触发临时安装:“installing the package to process help pages”步骤需要安装临时版本的包,如果此时包需要重编译,就会卡在该步骤等待编译完成。
解决建议
- 补充完善
.Rbuildignore规则,除已有的README规则外,新增以下规则:
可运行^\.git$ ^\.gitignore$ ^src/.*\.(o|so|dll)$ ^src/Makevars(\.win)?$ ^inst/include/stan_files/devtools::check_build_ignore()校验规则是否生效,排除无关文件进入构建流程。 - 运行build、check相关命令时禁用自动版本号追加,添加
use_version = FALSE参数:- 构建命令:
devtools::build(use_version = FALSE) - Windows检查命令:
devtools::check_win_release(use_version = FALSE)
该配置可避免DESCRIPTION被自动修改,不会触发无意义的全量重编译。
- 构建命令:
- 配置编译缓存降低重编译开销:Windows环境可安装配置
sccache,类Unix环境配置ccache,并在src/Makevars.win/src/Makevars中添加缓存相关编译参数,即使触发编译也可通过缓存大幅降低耗时。 - 提前生成帮助文件避免动态处理:运行
devtools::document()预先生成所有Rd格式帮助文件,构建时无需再触发临时安装流程处理帮助页面。
内容的提问来源于stack exchange,提问作者Dexter SherloConan
相关产品推荐
相关产品推荐

