我无法回答关于 renv
的问题,因为我没有使用过。但是我可以讲一下 Python 虚拟环境和 Julia 环境之间的区别。
正如您所猜测的那样,Python虚拟环境和Julia环境都满足项目隔离和可重现性的需求(以及通常与环境相关的所有内容)。然而,它们采用非常不同的方式来满足这些需求。
Python虚拟环境基本上是包含了一个完整的Python栈副本的文件夹,用于创建虚拟环境,即其中包含单独的python
可执行文件、与之关联的完整栈以及单独的site-packages
文件夹,用于包含在该环境中安装的所有Python软件包,包括单独的pip
和setuptools
的副本。这就是实现完全隔离的方式:每个环境都可以完全独立地处理软件包的安装。要使用虚拟环境,您需要激活
它们,这意味着将指向特定Python可执行文件所在的文件夹的路径临时添加到PATH环境变量中,以便在命令行上运行python
时运行正确的版本。这使得Python虚拟环境相对容易理解和使用,但相对较重,因为您基本上为每个创建的环境拥有一个完整的Python栈副本,包括完整的软件包集(在多个环境中可能有大量重复的软件包)。
Project.toml
的文件夹。这就是全部。Julia 包安装在称为“仓库”的位置,多个版本的同一软件包可以并存。当您向 Julia 环境中添加包时,Julia(在解决依赖关系后)首先检查所需软件包的版本是否已经在仓库中。如果是,则使用该软件包的该版本。仅当需要的软件包版本缺失时才会下载它。这意味着软件包的一个版本仅会被安装一次,并且多个环境可以重复使用相同的软件包,同时仍然相互隔离。在 Julia 中 “激活” 一个环境只需要让 Julia 使用该特定文件夹中的 Project.toml
决定使用哪些软件包。这种架构使得 Julia 环境特别轻巧。另外,它允许所谓的“堆叠环境”,您可以激活多个环境,并逐个搜索它们以选择要使用的软件包(通常情况下,当您在激活环境时运行 Julia 时,它总是堆叠在默认环境上,该环境始终处于激活状态)。我希望这可以帮到你。从实现的角度来看,Python虚拟环境和Julia环境截然不同。
回答来自 R/renv
方面: 默认情况下,R 从由.libPaths()
函数声明或设置的库路径加载包,这通常包括用户特定的库路径、零个或多个站点库路径和一个系统库。
例如,在 macOS 上使用 R 4.0.3,我看到:
> .libPaths()
[1] "/Users/kevinushey/Library/R/4.0/library"
[2] "/Library/Frameworks/R.framework/Versions/4.0/Resources/library"
这些库路径被所有R会话共享。而renv
只是让设置项目本地库路径变得更加容易,因此在renv
项目中,你可能会看到:
> .libPaths()
[1] "/Users/kevinushey/scratch/project/renv/library/macos/R-4.0/x86_64-apple-darwin17.0"
[2] "/Library/Frameworks/R.framework/Versions/4.0/Resources/library"
通常,这些项目本地库路径是由renv
自动装载程序设置到项目的.Rprofile
(当R启动时读取和执行),或者由用户显式调用renv::load("~/path/to/project")
来设置。
renv
不会管理或控制与项目本身使用的R版本,至少在版本0.12.3中没有这样做:这由用户或管理员处理。 renv
会在生成锁定文件(捕获项目中的R软件包依赖项)时写入正在使用的R版本,因此理论上前端可以使用该信息选择要与项目一起使用的适当解释器。
在这个意义上,renv
的工作比Python和Julia做得少,因为它只帮助管理项目中使用的R软件包;至少目前还没有提供任何将特定版本的R与项目关联的工具。然而,它也独特的是一个独立的R软件包,不像一些Python和Julia的工具集,内置于R本身。