更新CRAN包至0.2.1后vignette构建报错,求解决方案
我来帮你梳理下这个问题的解决思路——核心就是CRAN对包依赖的严格规则,和你vignette编译时需要的间接依赖没匹配上。咱们一步步来搞定:
1. 把utf8放到正确的依赖位置
打开你的包的DESCRIPTION文件,别把utf8加到Imports里(那是包核心功能必须的依赖),而是加到Suggests字段里,因为它只是编译vignette需要的,不是你的包本身运行必须的。示例如下:
Suggests: forecast, tsibble, utf8, knitr, rmarkdown
这样CRAN就知道这个包是给文档编译用的,不会判定你滥加依赖。
2. 在vignette里优雅加载utf8
别直接写library(utf8),换成条件检查的方式,既满足编译需求,又符合CRAN的检查逻辑:
# 编译vignette前检查utf8是否安装,没装就提示 if (!requireNamespace("utf8", quietly = TRUE)) { stop("Package 'utf8' is required to build this vignette. Please install it.", call. = FALSE) }
要是你确定CRAN的编译环境会自动安装Suggests里的包,也可以保留library(utf8),但必须确保它已经在Suggests里声明了,这样devtools检查时就不会再弹出未声明依赖的NOTE。
3. 处理本地检查的_SUGGESTS_报错
如果你本地跑devtools::check(cran=TRUE)还报错,大概率是你本地没装全Suggests里的包。要么先手动装一遍:
install.packages(c("forecast", "tsibble", "utf8", "knitr", "rmarkdown"))
要么临时设置环境变量跳过强制检查(只用来本地测试,提交CRAN别这么干):
Sys.setenv("_R_CHECK_FORCE_SUGGESTS_" = FALSE) devtools::check(cran=TRUE)
CRAN自己的检查系统会自动处理Suggests包的安装,不用你操心。
4. 最后验证一下
改完之后重新跑devtools::check_rhub(),应该就能正常编译vignette了,也不会再出现依赖相关的ERROR或NOTE。
为啥会出这个问题?
其实是因为tsibble把utf8列为了Suggests依赖,不是强制导入的。你用generate_ts输出tsibble格式时,触发了需要utf8的功能,但检查环境默认不会安装Suggests层级的依赖,所以得你自己显式声明出来。
内容的提问来源于stack exchange,提问作者user13971133

