插件#

为了启用与 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 生态系统带来了许多可能性,包括但不限于

  • 自定义子命令

  • 支持与打包相关的主题(例如,虚拟包

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

  • 替代依赖项求解器后端

  • 网络适配器

  • 构建系统集成

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

  • 当前 Conda 未涵盖的实验性功能

Conda 插件的优势#

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

  • 支持 Conda 社区中更好的维护分配

  • 使第三方贡献者能够使用官方 API,而无需绕过和包装

  • 通过官方 API 扩展 Conda 内部功能的能力

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

  • ……等等!