如何在R包findata中实现跨Windows/Linux的arrow差异化安装?
可以实现,提供两种可行方案
方案一:使用configure脚本(推荐,符合R包构建规范)
R源码包支持通过configure脚本在安装阶段执行平台检测与自定义逻辑,步骤如下:
- 在
findata包根目录创建configureShell脚本(执行chmod +x configure添加可执行权限),内容:
#!/bin/sh # 检测当前操作系统 if [ "$(uname)" = "Linux" ]; then # 生成Linux平台的arrow安装脚本 cat > inst/install_arrow.R << 'EOF' options( HTTPUserAgent = sprintf( "R/%s R (%s)", getRversion(), paste(getRversion(), R.version["platform"], R.version["arch"], R.version["os"]) ) ) install.packages("arrow", repos = "https://packagemanager.rstudio.com/all/__linux__/focal/latest") EOF else # 生成Windows平台的默认安装脚本 cat > inst/install_arrow.R << 'EOF' install.packages("arrow") EOF fi exit 0
在包的
DESCRIPTION文件中添加Configure: configure,告知R在安装前运行该脚本。在
R/zzz.R中添加.onLoad函数,加载包时自动检查并安装依赖:
.onLoad <- function(libname, pkgname) { if (!requireNamespace("arrow", quietly = TRUE)) { source(system.file("install_arrow.R", package = pkgname)) } }
用户安装findata时,configure会根据平台生成对应安装脚本,加载包时若检测到arrow未安装,将自动执行适配平台的安装命令。
方案二:直接在.onLoad中做平台判断(轻量快速)
无需Shell脚本,直接在包加载逻辑中处理:
在R/zzz.R中写入:
.onLoad <- function(libname, pkgname) { if (!requireNamespace("arrow", quietly = TRUE)) { if (.Platform$OS.type == "unix") { # Linux平台专属配置与安装 options( HTTPUserAgent = sprintf( "R/%s R (%s)", getRversion(), paste(getRversion(), R.version["platform"], R.version["arch"], R.version["os"]) ) ) install.packages("arrow", repos = "https://packagemanager.rstudio.com/all/__linux__/focal/latest") } else if (.Platform$OS.type == "windows") { # Windows平台默认安装 install.packages("arrow") } } }
注意事项
- 方案二是在包加载阶段安装依赖,而非构建过程,但用户体验相近。
- 需确保用户拥有包安装权限(Linux下可能需
sudo,建议在包文档中提示用户处理权限问题,避免自动使用sudo)。 - 若计划将包提交至CRAN,需注意CRAN不允许包自动执行
install.packages修改用户库,这种情况更建议在DESCRIPTION正常声明依赖,同时在README中说明Linux平台的特殊安装步骤。
内容的提问来源于stack exchange,提问作者Mislav Sagovac
相关产品推荐
相关产品推荐

