具有可选依赖项的 CRAN 包

CRAN package with an optional dependency

我构建了一个 R 包,其中一些函数使用了 V8 包。但是V8在一些平台上是不支持的,所以我想让这些功能只在支持V8的平台上可用。如何处理这种情况?我可以将 V8 放在 DESCRIPTIONSuggests 字段而不是 Imports 字段中,并测试它是否可用 requireNamespace,但是我该如何处理必须从 V8 导入的函数?我想将这个包提交给 CRAN。

我认为最干净的解决方案是拥有两个包。第一个包 (A) 将包含不(直接或间接)依赖于 V8 的所有代码。第二个包 (B) 将依赖于 A 并包含所有需要 V8.

的代码

                              +-------+
                              |       |
                              |  V8   |
                              |       |
                              +---^---+
                                  |
                                  | Requires
                                  |
         +-------+            +---+---+
         |       |            |       |
         |  A    <------------+  B    |
         |       |  Requires  |       |
         +-------+            +-------+

在支持 V8 的平台上,用户可以使用 B,在所有其他平台上,用户可以使用 A

A 可以 SuggestB

我通过复制 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它没有抱怨。