跳到主要内容

CEP 2 - 向 conda 添加插件架构

标题向 conda 添加插件架构
状态已接受
作者Jannis Leidel <jleidel@anaconda.com>
创建日期Jun 29, 2021
更新日期Jun 30, 2021
讨论https://github.com/conda/ceps/pull/1
实施(列在下方)

动机

Conda 由许多移动部件组成,包括 `conda`/`conda-build` 项目,甚至第三方项目。它依赖于与各种技术和工作流程机制的松散耦合。

Conda 将从通用插件架构中获益,因为它将

  • 涵盖目前服务不足的用例,
  • 支持社区中更好的维护分配,
  • 增加通过官方 API 扩展 conda 内部组件的能力
  • 并降低 conda 生态系统中其他利益相关者贡献的门槛。

实施

  • 集成 pluggyHookMan 以在 conda 中托管一组钩子,并允许外部软件包提供插件,以补充 conda 附带的默认实现。

  • 特别是对于性能关键的代码路径,插件架构将使开发创新解决方案成为可能,而无需冒险更改现有的稳定实现。

理由

Conda 的架构并非旨在通过官方插件 API 以编程方式扩展它。它可以从 Python 生态系统中其他已经使用插件多年的工具(例如 pytest、tox)中学习,这些工具拥有蓬勃发展且维护良好的生态系统。

与此同时,conda 作为一种用 Python 编写的工具,但在一个倾向于为工作使用最佳工具的生态系统中存在,这意味着插件架构最终应允许处理 Python 以外的编程语言和技术。

为 conda 项目的健康着想,也应该为社区提供为 conda 创建创新插件的手段,以迎合不断发展的科学界。第三方贡献者应使用官方 API,而不是不得不转向变通方法和包装器。

例如,CLI 已经可以通过 `PATH` 上遵循命名方案 `conda-([\w\-]+)$`(或 Windows 上的 `conda-([\w\-]+)\.(exe|bat)$`)的任何命令进行扩展。遗憾的是,这不足以实现与 conda 内部组件的低级别集成。

因此,为了更深入的集成功能,必须在 conda 中提供代码级别的插件钩子,例如,目前作为库 pycosat、pycryptosat 和 pysat 的静态映射实现的求解器功能。

其他可能有用处的示例领域(不属于此 CEP 的一部分)

  • shell 集成

  • 依赖关系求解器后端

  • 网络适配器

  • 虚拟软件包发现

  • 构建系统集成

  • 语言支持(R、Julia 等)

向后兼容性

  • 添加到 conda 的任何插件钩子都应默认为 conda 在接受其相关 CEP 时的最新主要版本中的工作方式。

  • 未来对 conda 插件钩子默认值的更新应进行向后兼容性审查,并遵循明确的兼容性策略,例如仅在主要版本中更改。

参考

所有 CEP 均明确采用 CC0 1.0 Universal