简体中文 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 鏡像。