首页 > 解决方案 > 安装自定义包的依赖

问题描述

我开发了一个本地包,它依赖于 CRAN 上可用的其他包(例如,pool)。因此,当我尝试使用标准安装包时

install.packages("/path/to/package",
                 repos = NULL,
                 type = "source")

我收到一个错误,因为未安装依赖项。install.packages有一个参数dependencies,默认情况下会尝试安装这些依赖项。但是,如手册页所述(并在下面的链接问题中评论),repos = NULL意味着依赖项被忽略。

为了解决这个问题,我使用 packageminiCRAN创建了一个包含我的包的 repo,希望我可以做一个repos = c("myRepo", getOption("repos"))让它工作。

现在我可以使用安装我的包

install.packages("package",
                 repos = c("/path/to/repo", getOptions("repos"),
                 type = "source")

但前提是我已经安装了pool. 如果没有,我仍然会收到错误,因为它找不到依赖项。

所以我调用miniCRAN::addPackage("pool")了 ,它将该包及其许多依赖项添加到我的存储库中,如果我调用它们,它们都会出现miniCRAN::pkgAvail()

但是,如果我尝试再次安装我的软件包,我仍然会收到there is no package called 'pool'错误消息。

有趣的是,如果我尝试pool从 repo 安装它自己,它就可以工作。

install.packages("pool",
                 repos = "/path/to/repo",
                 type = "source")
install.packages("package",
                 repos = "/path/to/repo",
                 type = "source")

然而,显然,这种方式比添加pool到 repo 更重要:我也可以从 CRAN 安装它。

那么这里发生了什么,这真的是安装本地包及其 CRAN 依赖项的唯一方法

标签: rpackagerepository

解决方案


弄清楚了。

问题是我对 的误解,roxygen我一直将其用于我的文档。我假设它处理了Imports:说明文件的部分,它不处理((1)(2))。因此,虽然 NAMESPACE 文件具有所有必要的importFrom(pool, ...)调用,pool但实际上并不在我的描述中。

在修复了这个疏忽之后,使用remote::install_local("path/to/pkg")(or devtools::install()) ( (3) ) 起作用了:它安装了我的包并从 CRAN 中提取了它的依赖项。


推荐阅读