跳至主要内容

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

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

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

info

当您需要与 conda 安装本身进行交互时,请使用它。

conda.base.context.context.root_prefix

Previously

 ●   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

warning

避免使用它。这是一个可能被弃用的竞争者。

conda.base.context.context.active_prefix

作为清理 conda info 输出的一部分,在 conda 4.4.0(见 https://github.com/conda/conda/commit/cbbe81f)中引入。

active_prefix 反映当前活动的环境,它由 $CONDA_PREFIX 环境变量决定,该变量由 conda activateconda deactivate 命令设置。

warning

避免使用它。将此视为内部值。

conda.base.context.context.default_prefix

Previously

 ●   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

warning

避免使用它。将此视为内部值。

conda.base.context.context.target_prefix

Previously

 ●   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

info

当您需要与当前环境进行交互时,请使用它。

本质上,conda 前缀系统是其环境管理功能的基石,方便用户在创建的不同环境之间无缝导航和交互。随着 conda 的不断发展,了解其前缀系统对于有效且正确地利用其功能至关重要。