插件#

为了启用自定义和与 conda 兼容且可被 conda 发现的额外功能(但不一定作为 conda 代码库的默认部分发布),自 22.11.0 版本起,已实施官方 conda 插件机制。

实施#

conda 中的插件通过利用 Pluggy Python 框架,集成了“钩子 + 入口点”结构。 此实现可以分解为以下两个步骤

  • 定义要注册的钩子

  • 在 conda 入口点命名空间下注册插件

钩子#

以下是一个非常基本的插件“钩子”示例

my_plugin.py#
import conda.plugins


@conda.plugins.hookimpl
def conda_subcommands(): ...

使用 pyproject.toml 文件进行打包#

以下是使用 pyproject.toml 文件配置 setuptools 的示例(请注意,如果定义了 pyproject.toml 文件,则 setup.py 文件是可选的,因此在此处不作讨论)

pyproject.toml#
[build-system]
requires = ["setuptools", "setuptools-scm"]
build-backend = "setuptools.build_meta"

[project]
name = "my-conda-plugin"
version = "1.0.0"
description = "My conda plugin"
requires-python = ">=3.7"
dependencies = ["conda"]

[project.entry-points."conda"]
my-conda-plugin = "my_plugin"

Conda 插件用例#

新的 conda 插件 API 生态系统带来了许多可能性,包括但不限于

  • 自定义子命令

  • 对打包相关主题的支持(例如虚拟软件包

  • 开发环境集成(例如,shells)

  • 替代依赖关系求解器后端

  • 网络适配器

  • 构建系统集成

  • 非 Python 语言支持(例如,C、Rust)

  • conda 目前未涵盖的实验性功能

Conda 插件的优势#

conda 插件生态系统使整个 conda 社区的贡献者能够开发和共享新功能,从而带来更多功能并专注于用户体验。 虽然以下列表绝非详尽无遗,但 conda 插件的一些优势包括

  • 支持在 conda 社区中更好地分配维护工作

  • 使第三方贡献者能够使用官方 API,而不是不得不转向变通方法和包装器

  • 通过官方 API 扩展 conda 内部组件的能力

  • 降低 conda 生态系统中其他利益相关者贡献的门槛

  • ... 以及更多!