R CMD check Mac 验收应在原生 macOS 环境完成:先核对 R 与 Apple 命令行工具链,再检查构建出的源码包、编译代码、测试和文档。Mac 检查通过,只能说明这个环境下的检查项通过,不能据此判定 Windows、Linux 或 CRAN 审查也会通过。
这篇文章适合维护课题组 R 包、需要在发布或交接前复核源码与测试的研究生和科研人员;也适合需要确认 macOS arm64 原生编译状况的包开发者,以及要替没有本地 Mac 的开发者安排验收环境的高校技术人员。
本周建议动作:先固定项目提交和环境信息,再按“准备 → 构建 → 检查 → 复核”的顺序执行;若项目还要支持其他系统,在交接记录中明确安排对应平台的检查。
先确定这次 Mac 验收要回答什么
R CMD check 会安装并检查 R 包,也会执行与包相关的测试、示例和文档检查;它不能替代另一操作系统或另一处理器架构上的实际验证。R 官方手册建议对 R CMD build 生成的归档文件运行最终检查,而不是只把开发目录里的状态当作发布包的结论。R 官方《Writing R Extensions》:检查与构建说明
先按验收目标选检查范围:
| 选项 | 能回答的问题 | 适用情形 | 不能单独证明 |
|---|---|---|---|
| 在当前开发目录运行检查 | 当前工作树的代码和文件大致能否通过检查 | 快速定位开发过程中的错误 | 打包时是否遗漏文件 |
| 构建源码包后在 Mac 上检查 | 归档产物能否在记录下来的 macOS 与 R 环境中安装、运行检查项 | macOS arm64 发布前验收 | Windows、Linux 或其他架构兼容 |
| 为 Windows、Linux 等目标分别检查 | 对应系统环境下的构建与运行问题 | 项目明确承诺支持多个平台 | CRAN 最终审查结果 |
因此,R 包 macOS arm64 验收记录应包含目标,而不只写“check 通过”。至少说明检查的是哪个提交、源码包是否成功构建、所用运行架构,以及哪些目标平台尚未覆盖。
建立可复核的环境基线,再开始检查
开始前先记录当前项目提交,例如 Git 提交标识;同时保存 R 版本、运行架构、macOS 版本、已安装依赖和开发者目录。版本与兼容性要求会随 R、macOS 和工具链更新,不能预设某个版本组合对所有包都适用;复核时应查对应发布版的官方手册和本机工具信息。
在 R 中保存基础环境信息:
R.version.string
R.version$platform
Sys.info()
sessionInfo()
这些输出可帮助区分“同一源码在不同环境表现不同”与“源码本身稳定复现”。此外,检查项目实际使用的依赖来源和版本记录,尤其注意 Suggests、Imports、LinkingTo 及需要外部系统库的代码。依赖无法获得、版本不一致或只存在于维护者个人库中,都会让结果难以交接。
Apple Command Line Tools 应该怎么核对?
含 C、C++、Fortran 原生代码,或需要系统头文件和链接库的科研包,检查前应确认编译工具可调用,并且当前选择的开发者目录符合本次验收设定。Apple 说明,Xcode Command Line Tools 可作为完整 Xcode 的替代安装方式;但只在完整 Xcode 中提供的命令并不一定包含在命令行工具包中。因此,不能把“装了命令行工具”理解为所有开发场景都已具备完整 Xcode。Apple:安装 Xcode Command Line Tools
先读取当前目录,再按需核实工具状态:
xcode-select --print-path
clang --version
pkgutil --pkg-info=com.apple.pkg.CLTools_Executables
如果 xcode-select --print-path 指向的目录不是预期环境,先核对机器上实际安装的位置,再按 Apple 文档选择开发者目录;不要直接复制其他机器的路径。Apple 提供了查看和切换当前命令行工具所用开发者目录的方法,切换可能需要管理员权限。Apple:配置命令行工具设置
注意: R CMD check 和 R CMD build 启动的 R 进程使用 --vanilla,不会读取通常的启动文件。若本机平时依赖启动脚本设置库路径或环境变量,交互式测试通过而正式检查失败时,先核对检查进程实际收到的环境;不要立刻把差异归结为 macOS 编译器问题。R 官方手册:检查进程与环境变量
先构建源码包,再检查实际交付物
只对工作目录运行检查,容易漏掉源码归档中未包含的文件。正式验收应从干净的项目副本开始构建,再对生成的源码包运行检查。R 的工具文档说明,R CMD build 用于构建源码包,R CMD check 可检查源码目录或归档文件;最终检查建议针对构建出的归档执行。R 工具文档:构建与检查 R 包
在项目根目录执行:
mkdir -p ../r-check-output
R CMD build . --output=../r-check-output
R CMD check ../r-check-output/包名_版本号.tar.gz \
--output=../r-check-output
将示例中的“包名_版本号”替换为实际生成的归档文件名。若当前 R 版本的命令选项或输出位置与示例不同,以 R CMD build --help 和 R CMD check --help 的本机帮助为准;检查前后不要覆盖归档,也不要只截取终端最后一行作为记录。
在记录中保留完整终端输出和检查目录。先按 ERROR、WARNING、NOTE 分类,再追到具体失败步骤和日志文件。三种级别不是同一个结论:例如 CRAN 政策对提交包的要求与维护者内部的发布判断相关,但不能把出现任意提示都说成同等严重,也不能只看最终状态来跳过问题说明。CRAN Repository Policy
编译错误从工具链、依赖和源码三处逐层排查
遇到编译失败,先看日志里最早出现的实际错误,而不是从末尾的失败汇总猜原因。可以按下面顺序缩小范围:
- 确认命令是否存在且路径正确。 检查
clang、make等日志提及的工具是否可调用,并留存xcode-select --print-path输出。 - 检查报错指向的头文件和库。 若提示找不到头文件或链接库,核实该系统依赖是否已安装、路径是否传给构建过程,以及目标架构是否匹配。
- 用最小操作复现。 在同一环境单独安装该源码包,保留完整输出;若单独安装也失败,再以报错文件和首个错误定位。
- 拆开包源码与环境因素。 比对失败文件是否来自包的
src、configure脚本或外部依赖;只有证据指向工具链时,才处理工具链选择或安装问题。
Mac 上检查 R 包时,编译错误应优先看具体报错中的首个缺失符号、头文件、库路径和编译器调用;不要把“重装全部开发工具”当成统一修复。C、C++、Fortran 包及系统库依赖包的失败原因可能完全不同。R 的安装管理手册也提示,macOS 上的安装环境与构建方式需要结合实际系统和 R 安装来判断,不能把一套工具配置推广到所有包。R 官方《R Installation and Administration》:macOS 安装说明
干净检查中的测试、示例和 vignette 要分别定位
R CMD check 不只编译代码,还会运行包中的测试、文档示例,并按包配置处理 vignette。检查失败时,先看失败分类与对应日志,再在干净会话中重跑相关部分;R 官方手册对这些检查项及日志位置有进一步说明。R 官方手册:检查示例与 vignette
R CMD check 的文档或 vignette 检查失败,可按症状缩小范围:
- 帮助文档或示例失败: 查看报错对应的
.Rd文件、函数参数和示例代码;确认示例不依赖之前交互会话创建的对象、用户目录文件或未声明依赖。 - 测试失败: 查看检查目录中的测试输出,确认测试所需文件随源码包分发,且依赖已在包元数据中声明。必要时先单独运行相应测试,再对归档重新检查。
- vignette 构建失败: 从日志中确认失败发生在代码执行、文档渲染还是依赖安装;逐段复现,不要因为开发机上已有缓存或私有数据,就把本地成功当作干净环境成功。
- 结果存在浮点或随机差异: 回到项目预先定义的预期行为、随机种子和数值容差来判断;不要为了消除某个平台上的失败,事后随意放宽阈值。
示例、测试和 vignette 还可能触及项目外部状态,例如默认工作目录、用户配置、网络服务或实验室私有文件。把这些依赖显式化,或准备可分发的最小测试数据,能让交接后的失败更容易复现。R 的工具文档列明了测试、示例和 vignette 等包检查类型,可用于对照日志分类。R tools 文档:已安装包的测试类型
形成平台验收结论,并安排缺口补测
完成 Mac 检查后,把结论写成可交接的记录,而不是只有“通过”两个字。建议记录:
- 项目提交标识、源码包文件名及其构建结果;
- R 版本、macOS 版本、
R.version$platform输出和 Apple 命令行工具目录; ERROR、WARNING、NOTE的处理情况,以及仍未解决的条目;- 测试、示例、文档和 vignette 是否运行,失败项对应的日志位置;
- 项目承诺支持的系统与架构,以及本次尚未执行的检查。
Mac 检查是否代表 Windows 和 Linux 可用? 不代表。它说明的是记录下来的 Mac 环境中,已执行的检查项得到什么结果;若项目承诺支持 Windows 或 Linux,应分别在目标平台验证,尤其留意路径规则、平台条件代码、原生编译和依赖差异。CRAN 提交也不等于本机检查:提交要求以当前政策为准,政策会变更,提交前应重新核对官方说明,而不是把一次本地 R CMD check 当作接收保证。CRAN Repository Policy:提交与检查要求
没有本地 Mac 怎么验收? 如果只需要静态审阅或 Linux 上的常规测试,可先在现有环境完成这些工作;但当项目明确需要 macOS arm64 编译结果,或使用 Mac 特有组件时,仍应安排原生 macOS 检查。实验室可按课题周期决定由设备轮换、购置或临时远程环境补齐。若考虑远程方案,可先比较Mac 云算力订购指南中的使用方式,并结合团队成员所在位置查看香港节点说明。
对于只需偶尔复核的课题组,远程 Mac 能避免为一次短期验收长期占用实验室预算;但它不能自动替代 Windows、Linux 验收,也不适合必须连接特定实体设备的工作。相较于把所有检查留在 Linux/Windows 上,后者缺少原生 macOS 编译验证;购买 Mac 会占用一次性设备预算,借用则受排期和环境一致性限制。若项目需要在短周期内完成 macOS 验收,按需租赁 NodeMini 的远程 Mac 可作为补充方案;若工作长期、高强度运行或依赖本地物理接口,则应优先评估自有设备是否更合适。