如何将整个基于 renv 的项目复制到新 PC无法访问互联网?

问题描述

我获得了一台可以运行大型模拟的强大机器的使用权。 我已经使用 renv 在 RStudio 项目中开发了代码。 Renv 制作所有软件包的本地副本并将其版本存储在锁定文件中。

目标机器(运行 Windows)无法访问互联网。我已将项目文件代码文件、renv 文件夹(其中包括包的所有本地副本、锁定文件.RProfile 文件)复制到目标计算机上的文件夹中。

当我在目标机器上打开项目时,.RProfile 执行 source("renv/activate.R")。但是,这无法加载项目,而是给我以下消息

The following package(s) are missing their DESCRIPTION files:

... Long list of packages ... 

These may be left over from a prior,Failed installation attempt.
Consider removing or re-installing these packages.

问题是我无法重新安装它们,因为这台机器无法访问互联网。我可以手动检查每个包并在我的工作机器上下载二进制文件,然后将它们传输到目标机器,然后一个一个地安装它们,但这似乎是一件非常痛苦的事情。

有没有办法说服 renv 或 R 本身只使用本地 renv 文件夹中的包?

解决方法

来自 https://rstudio.github.io/renv/articles/renv.html 的缓存部分:

将 renv 与全局包缓存一起使用时,项目库将作为符号链接(或在 Windows 上,连接点)目录形成到 renv 全局包缓存中。因此,虽然每个 renv 项目都与您系统上的其他项目隔离,但它们仍然可以根据需要重复使用相同的已安装包。

我认为这意味着尝试复制 renv 文件夹意味着复制那些连接点(类似于快捷方式/符号链接),而不是实际的底层文件夹。

看起来您已经有了解决方案,但另一种选择是调用 renv::isolate() 以确保您的项目不会链接到全局缓存中的包,而是直接维护一个独立的库。

,

最后我只是写了一个小脚本来复制文件。

sourceFolder = "some/path"
targetFolder = "some/other/path"
subFolders = list.files(sourceFolder)
for (i in seq_along(subFolders)) {
    subFolder = subFolders[i]
    file.copy(
        from = paste0(sourceFolder,subFolder),to = targetFolder,overwrite = TRUE,recursive = TRUE
    )
    paste(subFolder) |> message()
}