开发者指南:五个前缀的故事
在包管理和环境配置领域,conda
已经成为一个通用的工具,赋予开发者环境管理的能力。 conda
架构的一个关键方面在于它的前缀系统,该系统在其之前的版本中经历了重大的演变,将 conda
从一个简单的包管理器转变为一个庞大的环境管理器。 在这篇技术性文章中,我们将深入探讨 conda
的前缀系统的复杂性,阐明其演变以及 conda
源代码中描述的五个不同的前缀。
在 conda
开发的初期阶段,其主要功能围绕将软件包安装到单个环境中,当时称为 root
环境。 这个时代,以 4.2.0 之前的 conda
版本为标志,为 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 4.4.0
中引入(参见 https://github.com/conda/conda/commit/cbbe81f),作为清理 conda info
输出的一部分。
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
在 conda 1.3.0
中引入(参见 https://github.com/conda/conda/commit/9fd0f4b),用于从 CLI 实现中抽象出 --name
/--prefix
逻辑。
target_prefix
是最高级别的前缀,反映了用户通过 CLI 选项 --name
或 --prefix
的输入。 在没有 CLI 覆盖的情况下,它默认为 default_prefix
。
当您需要与当前环境交互时,请使用此项。
本质上,conda
前缀系统是其环境管理能力的基石,有助于在用户可能创建的不同环境中实现无缝导航和交互。 随着 conda
的不断发展,理解其前缀系统对于有效和正确地利用其功能仍然至关重要。