我打算使用 R 中的renv包在 linux 服务器上设置全局缓存,其他用户可以在其中:i)通过创建指向我创建的renv库的符号链接来使用这些包(从而节省内存和通过不将其安装到他们自己的私有库中来节省时间),并且 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”的可用包 Traceback(最近一次调用最后):9:renv:: restore() 8: renv_restore_run_actions(project, diff, current, lockfile, rebuild) 7: renv_retrieve(packages) 6: handler(package, renv_retrieve_impl(package)) 5: renv_retrieve_impl(package) 4: renv_retrieve_unknown_source(record) 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 库中(在这种情况下,它不是符号链接,并为每个用户存储一个重复的版本)。