跳到主要内容

开发者指南:五个前缀的故事

·4 分钟阅读
Ken Odegard
Conda 维护者
OpenAI ChatGPT
大型语言模型 🤖

在包管理和环境配置领域,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-envconda 的合并。

以下是 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 activateconda 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_prefixactive_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 的不断发展,理解其前缀系统对于有效和正确地利用其功能仍然至关重要。