Публикация пакетов ядра в npm
Все пакеты @aom-js/* выходят одной версией и все сразу, даже если часть из них в выпуске не менялась.
Почему одна версия
Заголовок раздела «Почему одна версия»- Пакеты тесно связаны:
apiзависит отcore,schemer,router,visualizer; отcoreзависят все остальные (граф — Архитектура ядра). Изменение вcoreпочти всегда тянет выпуск зависящих пакетов. - Две копии
coreв одном приложении ломают его: у каждой копии свой реестр мета-инстансов, и метаданные, записанные декораторами одной копии, не видны другой. Одна версия и точные ссылки между пакетами исключают такую смесь. - Пользователю правило одно: все пакеты
@aom-jsставятся одной версии.
Пакет без изменений выходит с новым номером и тем же содержимым — это нормально.
Где версия
Заголовок раздела «Где версия»- Номер — только в поле
versionкорневогоpackage.json.scripts/prebuild.jsподставляет его вpackage.jsonкаждого пакета; своей версии у пакета нет. - Ссылки между пакетами в
package.src.json—workspace:*. При публикацииbun publishзаменяет их на точную версию выпуска:@aom-js/api@0.1.0требует ровно@aom-js/core@0.1.0. - Первая общая версия —
0.1.0: она выше всех номеров, под которыми пакеты уже опубликованы в npm по отдельности.
Какую цифру поднимать
Заголовок раздела «Какую цифру поднимать»Пока версия начинается с 0.:
| Изменение | Пример |
|---|---|
| несовместимое: удалён или переименован публичный символ, изменилось поведение, на которое опирается приложение | 0.1.3 → 0.2.0 |
| исправление или новая возможность без поломки | 0.1.3 → 0.1.4 |
| пробный выпуск | 0.2.0-next.1 |
1.0.0 — когда публичный API устоялся; дальше обычный semver: несовместимое — первая цифра, новое — вторая, исправление — третья.
Как выпустить
Заголовок раздела «Как выпустить»- Ворота зелёные (из корня ядра):
bunx vitest run,bun run build(сборка со smoke-проверкой), затемbunx tsc -p tsconfig.json --noEmitиnode scripts/lint-ratchet.js— подробности в Архитектура ядра. - Поднять
versionв корневомpackage.json, выполнитьnode scripts/prebuild.js && bun install(номер попадёт вbun.lock), дописать раздел версии вCHANGELOG.md, закоммитить всё вместе. - Проверить без публикации:
bun run release:dry— тесты, сборка и состав архива каждого пакета (bun pm pack --dry-run); вход в npm не нужен. - Выпустить:
bun run release(нужен вход в npm с правом публикации в скоуп@aom-js). - Отправить метку:
git push origin v<версия>.
Что делает scripts/release.js:
- отказывает, если рабочее дерево не чистое — выпуск только из коммита;
- пропускает пакеты, у которых эта версия уже есть в npm, и отказывает, если она есть у всех: забыли поднять версию. Поэтому прерванный выпуск дотягивается повторным запуском;
- прогоняет
bunx vitest runиbun run build(сборка сprebuildи smoke-проверкой); - публикует пакеты в порядке зависимостей (
coreпервым,apiпоследним) с--access public; версия с дефисом (0.2.0-next.1) уходит под меткой npmnext, остальные — подlatest; - ставит git-метку
v<версия>.
- Публиковать один пакет в обход
bun run releaseили давать пакету свою версию. - Ссылаться между пакетами ядра на диапазон версий вместо
workspace:*. - Перевыпускать опубликованную версию: npm её не примет. Ошибочный выпуск — исправить следующей версией, сломанную пометить
npm deprecate @aom-js/<пакет>@<версия> "<причина>";npm unpublishне использовать.