Публикация модулей
Публикация модулей
Заголовок раздела «Публикация модулей»Делитесь переиспользуемым кодом в Wippy Hub.
Предварительные требования
Заголовок раздела «Предварительные требования»- Создайте аккаунт на hub.wippy.ai
- Создайте организацию или присоединитесь к существующей
- Зарегистрируйте имя модуля под вашей организацией
Структура модуля
Заголовок раздела «Структура модуля»mymodule/├── wippy.yaml # Манифест модуля├── src/│ ├── _index.yaml # Определения записей│ └── *.lua # Исходные файлы└── README.md # Документация (опционально)wippy.yaml
Заголовок раздела «wippy.yaml»Манифест модуля:
organization: acmemodule: http-utilsdescription: HTTP utilities and helperslicense: MITrepository: https://github.com/acme/http-utilshomepage: https://acme.devkeywords: - http - utilities| Поле | Обязательное | Описание |
|---|---|---|
organization | Да | Имя вашей организации в hub |
module | Да | Имя модуля |
description | Нет | Краткое описание |
license | Нет | Идентификатор SPDX (MIT, Apache-2.0) |
repository | Нет | URL репозитория исходников |
homepage | Нет | Главная страница проекта |
keywords | Нет | Поисковые ключевые слова |
Определения записей
Заголовок раздела «Определения записей»Записи определяются в _index.yaml:
version: "1.0"namespace: acme.http
entries: - name: definition kind: ns.definition meta: title: HTTP Utilities description: Helpers for HTTP operations
- name: client kind: library.lua source: file://client.lua modules: - http_client - jsonЗависимости
Заголовок раздела «Зависимости»Объявление зависимостей от других модулей:
entries: - name: __dependency.wippy.test kind: ns.dependency meta: description: Testing framework component: wippy/test version: ">=0.3.0"Ограничения версий:
| Ограничение | Значение |
|---|---|
* | Любая версия |
1.0.0 | Точная версия |
>=1.0.0 | Минимальная версия |
^1.0.0 | Совместимая (тот же major) |
Требования
Заголовок раздела «Требования»Определите конфигурацию, которую должны предоставлять потребители:
entries: - name: api_endpoint kind: ns.requirement meta: description: API endpoint URL targets: - entry: acme.http:client path: ".meta.endpoint" default: "https://api.example.com"Targets указывают, куда внедряется значение:
entry— полный ID записи для конфигурированияpath— JSONPath для внедрения значения
Потребители настраивают через override. Флаг -o принимает тройку namespace:entry:field=value:
wippy run -o acme.http:client:meta.endpoint=https://custom.api.comИмпорты
Заголовок раздела «Импорты»Ссылки на другие записи:
- name: handler kind: function.lua source: file://handler.lua modules: - json imports: client: acme.http:client # То же пространство имён utils: acme.utils:helpers # Другое пространство имён base_registry: :registry # ВстроенноеВ Lua:
local client = require("client")local utils = require("utils")Контракты
Заголовок раздела «Контракты»Определение публичных интерфейсов:
- name: http_contract kind: contract.definition meta: name: HTTP Client Contract methods: - name: get description: Perform GET request - name: post description: Perform POST request
- name: http_contract_binding kind: contract.binding contracts: - contract: acme.http:http_contract methods: get: acme.http:get_handler post: acme.http:post_handlerПроцесс публикации
Заголовок раздела «Процесс публикации»1. Аутентификация
Заголовок раздела «1. Аутентификация»wippy auth login2. Подготовка
Заголовок раздела «2. Подготовка»wippy initwippy updatewippy lint3. Валидация
Заголовок раздела «3. Валидация»wippy publish --dry-run4. Публикация
Заголовок раздела «4. Публикация»wippy publish --version 1.0.0С release notes:
wippy publish --version 1.0.0 --release-notes "Initial release"Дополнительные флаги
Заголовок раздела «Дополнительные флаги»| Флаг | Описание |
|---|---|
--label <name> | Опубликовать как изменяемый label (например, latest, beta) вместо неизменяемой версии |
--protected | Пометить опубликованную версию как защищённую (нельзя удалить или перезаписать) |
--registry <url> | Переопределить URL реестра для этой публикации |
--config <dir> | Каталог, содержащий wippy.yaml (по умолчанию: текущий) |
--create | Зарегистрировать модуль на хабе, если он ещё не существует, затем опубликовать |
--module-visibility <v> | Видимость для --create: private (по умолчанию) или public |
--module-type <t> | Тип для --create: application (по умолчанию), library, agent или plugin |
--module-display-name <n> | Отображаемое имя для --create |
Встраивание статических файлов
Заголовок раздела «Встраивание статических файлов»Модули с записями fs.directory (статические ассеты, шаблоны, публичные файлы) должны использовать --embed, чтобы включить их в опубликованный пакет. Без него записи fs.directory исключаются.
wippy publish --version 1.0.0 --embed app:public_fileswippy publish --version 1.0.0 --embed app:assets,app:templatesФлаг --embed принимает ID или имена записей, соответствующие fs.directory. Тот же флаг доступен в wippy pack.
Первая публикация
Заголовок раздела «Первая публикация»При первой публикации модуля он автоматически регистрируется на хабе (по умолчанию приватным), и публикация повторяется один раз. Передайте --create, чтобы зарегистрировать его заранее и задать его свойства:
wippy publish --create --version 0.1.0 \ --module-visibility public \ --module-type library \ --module-display-name "HTTP Utils"--create идемпотентен — для уже зарегистрированного модуля шаг создания ничего не делает. Если ваша учётная запись не может создавать модули в организации, хаб возвращает ошибку прав доступа вместо публикации.
Публикация в локальный хаб
Заголовок раздела «Публикация в локальный хаб»Укажите --registry на локально запущенный хаб, чтобы публиковать и устанавливать без публичного реестра. Обычный HTTP разрешён только для локальных хостов — localhost, 127.0.0.1 и контейнерных алиасов host.docker.internal (Docker Desktop / OrbStack) и host.containers.internal (Podman); любой другой хост должен использовать HTTPS.
wippy auth login --registry http://localhost:8080 --token wpy_xxxwippy publish --registry http://localhost:8080 --create --version 0.1.0Реестр и токен также могут поступать из переменных окружения WIPPY_REGISTRY и WIPPY_TOKEN. Когда они не заданы, реестр по умолчанию — https://hub.wippy.ai.
Если квота организации на приватные модули исчерпана, публикация завершается с сообщением вроде cannot publish: Private-module quota exhausted (5 of 5).... Сделайте модуль публичным или попросите администратора организации увеличить квоту. Загрузки и скачивания автоматически повторяются при временных сетевых ошибках.
Использование опубликованных модулей
Заголовок раздела «Использование опубликованных модулей»Добавление зависимости
Заголовок раздела «Добавление зависимости»wippy add acme/http-utilswippy add acme/http-utils@1.0.0wippy installКонфигурация требований
Заголовок раздела «Конфигурация требований»Переопределение значений во время выполнения:
wippy run -o acme.http:client:meta.endpoint=https://my.api.comИли в .wippy.yaml:
override: acme.http:client:meta.endpoint: "https://my.api.com"Импорт в вашем коде
Заголовок раздела «Импорт в вашем коде»# ваш src/_index.yamlentries: - name: __dependency.acme.http kind: ns.dependency component: acme/http-utils version: ">=1.0.0"
- name: my_handler kind: function.lua source: file://handler.lua imports: http: acme.http:clientПолный пример
Заголовок раздела «Полный пример»wippy.yaml:
organization: acmemodule: cachedescription: In-memory caching with TTLlicense: MITkeywords: - cache - memorysrc/_index.yaml:
version: "1.0"namespace: acme.cache
entries: - name: definition kind: ns.definition meta: title: Cache Module
- name: max_size kind: ns.requirement meta: description: Maximum cache entries targets: - entry: acme.cache:cache path: ".meta.max_size" default: "1000"
- name: cache kind: library.lua meta: max_size: 1000 source: file://cache.lua modules: - timesrc/cache.lua:
local time = require("time")
local cache = {}local store = {}local max_size = 1000
function cache.set(key, value, ttl) if #store >= max_size then cache.evict_oldest() end store[key] = { value = value, expires = ttl and (time.now():unix() + ttl) or nil }end
function cache.get(key) local entry = store[key] if not entry then return nil end if entry.expires and time.now():unix() > entry.expires then store[key] = nil return nil end return entry.valueend
return cacheПубликация:
wippy init && wippy update && wippy lintwippy publish --version 1.0.0