简体中文 English 繁體中文 日本語 Русский
本文为静态镜像,内容以交互版为准 在交互式文档中心打开 →

发布与模块商店指南

将你开发的模块或适配器发布到 ErisPulse 模块商店,让其他用户可以方便地发现和安装。

模块商店概述

ErisPulse 模块商店是一个集中式的模块注册表,用户可以通过 CLI 工具浏览、搜索和安装社区贡献的模块、适配器。

浏览与发现

# 列出远程可用的所有包
epsdk list-remote

# 只查看模块
epsdk list-remote -t modules

# 只查看适配器
epsdk list-remote -t adapters

# 强制刷新远程包列表
epsdk list-remote -r

你也可以访问 ErisPulse 官网 在线浏览模块商店。

支持的提交类型

类型 说明 Entry-point 组
模块 (Module) 扩展机器人功能、实现业务逻辑 erispulse.module
适配器 (Adapter) 连接新的消息平台 erispulse.adapter

快速发布

整个过程只需要三步:配置项目 → 发布到 PyPI → 提交到模块商店。

1. 配置 pyproject.toml

确保项目目录包含 pyproject.toml、README.md,并根据类型配置 entry-points:

模块

[project]
name = "ErisPulse-MyModule"
version = "1.0.0"
description = "模块功能描述"
requires-python = ">=3.10"
license = { text = "MIT" }
authors = [ { name = "yourname" } ]
dependencies = [
    "ErisPulse>=2.0.0",
]

[project.entry-points."erispulse.module"]
"MyModule" = "MyModule:Main"

适配器

[project]
name = "ErisPulse-MyAdapter"
version = "1.0.0"
description = "适配器功能描述"
requires-python = ">=3.10"

[project.entry-points."erispulse.adapter"]
"myplatform" = "MyAdapter:MyAdapter"

注意:包名建议以 ErisPulse- 开头,便于用户识别。Entry-point 的键名(如 "MyModule")将作为模块在 SDK 中的访问名称。

2. 发布到 PyPI

# 构建 + 发布(需要 PyPI 账号)
pip install build twine
python -m build
python -m twine upload dist/*

发布成功后验证安装:

pip install ErisPulse-MyModule

3. 提交到模块商店

前往 ErisPulse 模块商店,点击「提交模块」,登录后填写模块信息即可。

支持的登录方式:GitHub、Codeberg、云湖,任选其一即可。

填写要点:

提交后立即生效,用户可通过模块源安装。模块会被标记为「未验证」,维护者审核通过后改为「已验证」。

关于验证状态:

  • 「未验证」仅表示尚未经过官方审核,不代表模块有问题
  • 用户通过 epsdk install 安装未验证模块时会收到风险提示,需确认后才可继续安装

4. 管理已发布的模块

在模块商店点击「提交模块」并登录后,切换到「我的模块」标签页,可以:

刚提交的模块可能需要几分钟才会显示在「我的模块」列表中。

更新已发布模块

  1. 更新 pyproject.toml 中的 version
  2. 重新构建并上传:python -m build && python -m twine upload dist/*
  3. 模块商店会自动同步 PyPI 上的最新版本

用户通过 epsdk upgrade MyModule 即可升级。

发布前检查清单

在推送到 PyPI 之前,请逐项确认以下内容:

代码质量

兼容性

配置

文档

发布

开发模式测试

在正式发布前,可以使用可编辑模式在本地测试:

epsdk install -e /path/to/MyModule
# 或
pip install -e /path/to/MyModule

常见问题

包名必须以 ErisPulse- 开头吗?

不强制,但强烈推荐。这有助于用户在 PyPI 上识别 ErisPulse 生态的包。

一个包可以注册多个模块吗?

可以。在 entry-points 中配置多个键值对即可:

[project.entry-points."erispulse.module"]
"ModuleA" = "MyPackage:ModuleA"
"ModuleB" = "MyPackage:ModuleB"

审核需要多长时间?

通常在 1-3 个工作日内完成。你可以在模块商店「我的模块」中查看验证状态。

通过 Docker 镜像分发应用

如果你的应用不适合发布到 PyPI(如包含私有依赖、需要预配置环境),可以通过 GitHub Container Registry (GHCR) 发布 Docker 镜像,让其他用户 docker pull 一键启动。

适用场景

1. 创建 Dockerfile

基于 ErisPulse 官方镜像构建,只需添加你的模块即可:

FROM erispulse/erispulse:latest

LABEL org.opencontainers.image.title="ErisPulse-MyModule" \
      org.opencontainers.image.description="模块描述" \
      org.opencontainers.image.url="https://github.com/yourname/ErisPulse-MyModule" \
      org.opencontainers.image.source="https://github.com/yourname/ErisPulse-MyModule"

COPY pyproject.toml README.md ./
COPY MyModule/ ./MyModule/

RUN uv pip install --system -e .

如果模块需要额外的系统依赖(如 SSH 客户端等),在 RUN uv pip install 之后添加:

RUN apt-get update && apt-get install -y --no-install-recommends \
    openssh-client \
    && rm -rf /var/lib/apt/lists/*

erispulse/erispulse:latest 已包含 ErisPulse、ErisPulse-Dashboard、Python 运行时和 uv,无需重复安装。

2. 创建 GitHub Actions 工作流

在 .github/workflows/docker-publish.yml 中创建:

name: 发布 Docker 镜像

on:
  workflow_dispatch:
  push:
    branches:
      - main
    tags:
      - "v*"

permissions:
  contents: read
  packages: write

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository_owner }}/my-bot

jobs:
  docker-publish:
    runs-on: ubuntu-latest

    steps:
      - name: 检出代码
        uses: actions/checkout@v4

      - name: 设置 QEMU (多架构支持)
        uses: docker/setup-qemu-action@v3

      - name: 设置 Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: 登录 GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: 提取 Docker 元数据
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          tags: |
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=raw,value=latest

      - name: 构建并推送 Docker 镜像
        uses: docker/build-push-action@v6
        with:
          context: .
          file: ./Dockerfile
          platforms: linux/amd64,linux/arm64
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

GITHUB_TOKEN 由 GitHub Actions 自动提供,无需手动创建密钥。

3. 触发构建

推送代码或打 Tag 即可自动构建:

# 推送到 main 分支触发
git push origin main

# 或打 Tag 触发
git tag v1.0.0
git push origin v1.0.0

也可在 GitHub 仓库的 Actions 页面手动触发。

4. 设置镜像为公开

GHCR 镜像默认为 private,需要在 GitHub 设置为 Public 后其他用户才能免登录拉取:

  1. 进入仓库 → Packages → 点击对应 Package
  2. Package settings → Danger Zone → Change visibility → Public

5. 用户使用

构建完成后,用户可以用 docker run 一行启动:

docker run -d \
  --name my-bot \
  -p 8000:8000 \
  -v $(pwd)/config:/app/config \
  -e TZ=Asia/Shanghai \
  -e ERISPULSE_DASHBOARD_TOKEN=your-token \
  --restart unless-stopped \
  ghcr.io/<your-username>/my-bot:latest

或使用 docker-compose.yml:

services:
  my-bot:
    image: ghcr.io/<your-username>/my-bot:latest
    container_name: my-bot
    ports:
      - "8000:8000"
    volumes:
      - ./config:/app/config
    environment:
      - TZ=Asia/Shanghai
      - ERISPULSE_DASHBOARD_TOKEN=${ERISPULSE_DASHBOARD_TOKEN:-}
    restart: unless-stopped

同时发布到 Docker Hub

扩展工作流,在登录步骤前添加 Docker Hub 登录,并在 images 中增加 Docker Hub 地址:

      - name: 登录 Docker Hub
        uses: docker/login-action@v3
        with:
          registry: docker.io
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: 提取 Docker 元数据
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: |
            docker.io/<your-dockerhub-username>/my-bot
            ghcr.io/${{ github.repository_owner }}/my-bot

需要在仓库 Settings → Secrets 中添加 DOCKERHUB_USERNAME 和 DOCKERHUB_TOKEN。

Docker 镜像 vs PyPI 发布

特性 Docker 镜像 (GHCR) PyPI 发布
分发方式 docker pull 一键运行 pip install + 手动配置
适用范围 完整应用/解决方案 单个模块/适配器
私有依赖 天然支持 需要私有 PyPI 源
模块商店 不适用 可提交到模块商店
多架构 支持 amd64/arm64 与架构无关

两种方式不冲突——你可以同时通过 PyPI 发布模块到模块商店,又通过 GHCR 提供开箱即用的 Docker 镜像。