M M*_*M M 5 versioning r r-package renv
我打算使用R 中的renv包在 Linux 服务器上设置全局缓存,其他用户将能够: i)通过创建指向我创建的renv库的符号链接来使用这些包(因此节省内存和时间(不将其安装到自己的私有库中),以及 ii)在包的多个版本之间快速切换(取决于项目)。
目标是能够快速重现一个人的代码,而无需事先安装或讨论设置。该人唯一需要的是一个锁定文件,使用 renv 根据相应的锁定文件设置相同的环境,然后运行/重现代码。
考虑以下示例:
我完成了一个项目,该项目使用了 CRAN 的公共包以及我自己开发的包。我现在通过设置创建共享/全局缓存:
Sys.setenv(RENV_PATHS_CACHE = "/path/to/global/cache")
Run Code Online (Sandbox Code Playgroud)
并运行:
renv::init()
Run Code Online (Sandbox Code Playgroud)
这会按预期创建一个包含所有包的文件夹。
尽管如此,如果我想通过创建一个新项目来测试这一点,将 renv.lock 文件复制到新项目文件夹中,然后运行
renv::restore()
Run Code Online (Sandbox Code Playgroud)
它无法检索私有包,因为它尝试从 CRAN 存储库检索它:
错误:无法检索包“rmvtools”另外:警告消息:无法检索 url“https://cran.rstudio.com/src/contrib”的可用包回溯(最近调用最后):9:renv ::恢复() 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( record) 2: stopf("无法检索包 '%s'", record$Package) 1: stop(sprintf(fmt, ...), call. = call.)
如何“强制” renv ::restore 直接从全局缓存(而不是 CRAN 存储库)创建所谓的符号链接?
我现在的解决方法是将 RENV_PATHS_LOCAL 变量设置为与全局缓存相同的路径,并将 private_package.tar.gz 文件复制到全局缓存。不过,这不是必需的,因为我在设置全局缓存时已经安装了该软件包。通过此解决方法,用户必须使用 .tar.gz 文件将私有包安装到他自己的私有 renv 库中(在本例中不是符号链接,并为每个用户存储重复版本)。
通常,renv::restore()如果可以在全局缓存中找到请求的包,则会从全局缓存中查找并使用包,因此我认为根本问题是为什么renv无法解析缓存中的该包。
您的包裹的条目是什么renv.lock样的?它有一个Hash字段吗?该Hash字段是否解析到缓存中的正确位置renv?renv这是尝试解析全局缓存中的包时使用的键。
您可以使用:
renv:::renv_cache_list(packages = "<package>")
Run Code Online (Sandbox Code Playgroud)
查看特定包的缓存条目。
另一种选择是设置本地 R 包存储库,并从该存储库中提供您的私有包。这甚至可以是使用文件 URI 引用的网络文件系统上的包存储库;例如:
options(repos = c(ORG = "file:///path/to/local/repository"))
Run Code Online (Sandbox Code Playgroud)
miniCRAN包在创建此类存储库时可能很有用。
如果这些信息都不够,我建议在https://github.com/rstudio/renv/issues提交问题。