renv::restore() 错误:无法检索“包”使用私有包

问题描述

我打算使用 R 中的 包在 Linux 服务器上设置全局缓存,其他用户可以在其中:i) 通过创建 {{3}我创建的库(因此通过不将其安装到他们自己的私有库中来节省内存和时间),并且 ii) 在包的多个版本之间快速切换(取决于项目)。

目标是能够快速复制人员代码,无需事先安装或讨论设置。这个人唯一需要的是一个文件,使用 renv 根据相应的锁文件相同地设置他/她的环境,然后运行/重现代码

考虑以下示例:

我完成了一个项目,它使用了 CRAN 的公共包,还有一个我自己开发的包。我现在通过设置创建共享/全局缓存:

Sys.setenv(RENV_PATHS_CACHE = "/path/to/global/cache")

然后运行:

renv::init()

按预期创建一个包含所有包的文件夹。

然而,如果我想通过创建一个新项目来测试这个,将 renv.lock 文件复制到新项目文件夹中,然后运行

renv::restore()

它无法检索私有包,因为它试图从 CRAN 存储库中检索它:

错误:无法检索包“rmvtools” 另外: 警告信息: 无法检索 url 'https://cran.rstudio.com/src/contrib' 的可用包 回溯(最后一次调用): 9: renv::restore() 8:renv_restore_run_actions(项目,差异,当前,锁文件,重建) 7: renv_retrieve(包) 6:处理程序(包,renv_retrieve_impl(包)) 5: renv_retrieve_impl(包) 4:renv_retrieve_unkNown_source(记录) 3:renv_retrieve_repos(记录) 2: stopf("获取包'%s'失败",record$Package) 1:停止(sprintf(fmt,...),呼叫。=呼叫。)

如何“强制”::restore 直接从全局缓存(而不是 CRAN 存储库)创建所谓的符号链接

我现在的解决方法是将 RENV_PATHS_LOCAL 变量设置为与全局缓存相同的路径,并将 private_package.tar.gz 文件复制到全局缓存。尽管如此,这应该不是必需的,因为我在设置全局缓存时已经安装了该包。使用此解决方法用户必须使用 .tar.gz 文件将私有包安装到他自己的私有 renv-library 中(在这种情况下,它不是符号链接,并为每个用户存储一个重复的版本)。

解决方法

通常,如果可以在全局缓存中找到请求的包,renv::restore() 会从全局缓存中查找并使用包,所以我认为根本问题是为什么 renv 无法解决该问题包在缓存中。

您的包裹在 renv.lock 中的条目是什么样的?它有 Hash 字段吗?该 Hash 字段是否解析为 renv 缓存中的正确位置?这是 renv 在尝试解析全局缓存中的包时使用的键。

您可以使用:

renv:::renv_cache_list(packages = "<package>")

查看特定包的缓存条目。

另一种选择是设置本地 R 包存储库,并从该存储库中提供您的私有包。这甚至可以是使用文件 URI 引用的网络文件系统上的包存储库;例如类似:

options(repos = c(ORG = "file:///path/to/local/repository"))

miniCRAN 包可能有助于创建此类存储库。

如果这些信息都不够,我建议在 https://github.com/rstudio/renv/issues 提交问题。