开发者指南:五个前缀的故事
在包管理和环境配置领域,conda
已经成为一个通用的工具,为开发者提供了强大的环境管理功能。conda
架构的一个关键方面是它的前缀系统,该系统在其早期版本中经历了重大的演变,将 conda
从一个简单的包管理器转变为一个庞大的环境管理器。在本篇技术讨论中,我们将深入探讨 conda
前缀系统的复杂性,阐明其演变过程以及 conda
源代码中定义的五个不同前缀。
在 conda
开发的早期阶段,其主要功能是将包安装到一个单独的环境中,当时称为 root
环境。这个时期,即 conda
版本低于 4.2.0 的时期,为 conda
随后作为环境管理器的演变奠定了基础。
随着 conda 4.2.0
及更高版本的发布,当 conda-env
项目被 合并 到 conda
项目中时,发生了范式转变,将 conda
从一个单纯的包管理器提升为一个全面的环境管理器。这一关键的转变赋予了 conda
创建和管理独立环境的能力,促进了开发工作流程中的模块化和灵活性。
通过 git blame
探索 conda
的 Git 历史,可以获得对前缀系统演变时间线的宝贵见解。通过追踪提交历史,我们发现了引入和完善 conda
架构中各个关键前缀的关键时刻。历史揭示了 conda
前缀系统演变的两个不同阶段。第一阶段发生在 conda 1.x
的早期,而第二阶段则发生在 conda 4.x
的后期,与 conda-env
与 conda
的合并有关。
以下是 conda
中定义的五个前缀,按从最低级别(系统级,配置最少)到最高级别(用户级,配置最多)排序
conda.base.context.context.conda_prefix
作为私有环境工作的一部分,在 conda 4.2.0
(见 https://github.com/conda/conda/commit/6e730cc)中引入,此工作现已废弃和弃用。
conda_prefix
位于前缀系统的核心,表示 conda
本身的安装目录。通常,这与 base
环境的位置一致,并且等效于 Python 的 sys.prefix
值。
当您需要与 conda
安装本身进行交互时,请使用它。
conda.base.context.context.root_prefix
● conda.config.ROOT_DIR
↓ conda.config.root_dir
○ conda.base.context.context.root_prefix
在 conda 1.1.0
(见 https://github.com/conda/conda/commit/d2b370a)中引入,最初仅用于测试目的。
root_prefix
充当 可配置值,最容易在用户的 ~/.condarc
文件中进行配置。在没有用户定义的首选项的情况下,它默认为 conda_prefix
。
避免使用它。这是一个可能被弃用的竞争者。
conda.base.context.context.active_prefix
作为清理 conda info
输出的一部分,在 conda 4.4.0
(见 https://github.com/conda/conda/commit/cbbe81f)中引入。
active_prefix
反映当前活动的环境,它由 $CONDA_PREFIX
环境变量决定,该变量由 conda activate
和 conda deactivate
命令设置。
避免使用它。将此视为内部值。
conda.base.context.context.default_prefix
● conda.anaconda.default_environment
↓ conda.config.default_environment
↓ conda.config.DEFAULT_ENV_PREFIX
↓ conda.config.default_prefix
○ conda.base.context.context.default_prefix
作为更大配置改革的一部分,在 conda 1.1.0
(见 https://github.com/conda/conda/commit/acd8144)中引入。
当环境处于活动状态时,default_prefix
与 active_prefix
相同。当没有环境处于活动状态时,将返回默认环境(可以通过 $CONDA_DEFAULT_ENV
环境变量覆盖),否则默认为 root_prefix
。
避免使用它。将此视为内部值。
conda.base.context.context.target_prefix
● conda.cli.utils.get_prefix()
↓ conda.cli.common.get_prefix()
↓ conda.base.context.context.prefix
○ conda.base.context.context.target_prefix
作为从 CLI 实现中抽象出 --name
/--prefix
逻辑的一部分,在 conda 1.3.0
(见 https://github.com/conda/conda/commit/9fd0f4b)中引入。
target_prefix
是最高级别的前缀,它反映了用户通过 CLI 选项 --name
或 --prefix
提供的输入。在没有 CLI 覆盖的情况下,它默认为 default_prefix
。
当您需要与当前环境进行交互时,请使用它。
本质上,conda
前缀系统是其环境管理功能的基石,方便用户在创建的不同环境之间无缝导航和交互。随着 conda
的不断发展,了解其前缀系统对于有效且正确地利用其功能至关重要。