具有可选依赖项的 CRAN 包
CRAN package with an optional dependency
我构建了一个 R 包,其中一些函数使用了 V8
包。但是V8
在一些平台上是不支持的,所以我想让这些功能只在支持V8
的平台上可用。如何处理这种情况?我可以将 V8
放在 DESCRIPTION
的 Suggests
字段而不是 Imports
字段中,并测试它是否可用 requireNamespace
,但是我该如何处理必须从 V8
导入的函数?我想将这个包提交给 CRAN。
我认为最干净的解决方案是拥有两个包。第一个包 (A
) 将包含不(直接或间接)依赖于 V8
的所有代码。第二个包 (B
) 将依赖于 A
并包含所有需要 V8
.
的代码
+-------+
| |
| V8 |
| |
+---^---+
|
| Requires
|
+-------+ +---+---+
| | | |
| A <------------+ B |
| | Requires | |
+-------+ +-------+
在支持 V8
的平台上,用户可以使用 B
,在所有其他平台上,用户可以使用 A
。
包 A
可以 Suggest
包 B
。
我通过复制 reactR
包使用的方式找到了解决方案。
在 Suggests
字段中输入 V8
。
不要导入V8
或其在NAMESPACE
中的函数;使用 V8::...
来使用 V8
函数。
在需要V8
的函数中,使用requireNamespace
检查是否存在V8
,如果不存在则抛出消息或错误:
if(!requireNamespace("V8")){
message("This addin requires the 'V8' package.")
return(invisible())
}
我运行R CMD CHECK
它没有抱怨。
我构建了一个 R 包,其中一些函数使用了 V8
包。但是V8
在一些平台上是不支持的,所以我想让这些功能只在支持V8
的平台上可用。如何处理这种情况?我可以将 V8
放在 DESCRIPTION
的 Suggests
字段而不是 Imports
字段中,并测试它是否可用 requireNamespace
,但是我该如何处理必须从 V8
导入的函数?我想将这个包提交给 CRAN。
我认为最干净的解决方案是拥有两个包。第一个包 (A
) 将包含不(直接或间接)依赖于 V8
的所有代码。第二个包 (B
) 将依赖于 A
并包含所有需要 V8
.
+-------+
| |
| V8 |
| |
+---^---+
|
| Requires
|
+-------+ +---+---+
| | | |
| A <------------+ B |
| | Requires | |
+-------+ +-------+
在支持 V8
的平台上,用户可以使用 B
,在所有其他平台上,用户可以使用 A
。
包 A
可以 Suggest
包 B
。
我通过复制 reactR
包使用的方式找到了解决方案。
在
Suggests
字段中输入V8
。不要导入
V8
或其在NAMESPACE
中的函数;使用V8::...
来使用V8
函数。在需要
V8
的函数中,使用requireNamespace
检查是否存在V8
,如果不存在则抛出消息或错误:if(!requireNamespace("V8")){ message("This addin requires the 'V8' package.") return(invisible()) }
我运行R CMD CHECK
它没有抱怨。