🌐 Translations • 📜 Code of Conduct
Монорепозиторий с инструментами для анализа истории git и построения release core в соответствии со спецификацией Conventional Commits.
@modulify/conventional-git— Тонкая обертка над git с парсингом conventional-коммитов и помощниками для семантических тегов.@modulify/conventional-bump— Помощник для семантических релизов, который рекомендует следующую версию (major/minor/patch).@modulify/conventional-changelog— Генерация чейнджлога из истории git с использованием шаблонов Nunjucks.@modulify/conventional-release— Library-first release-core пакет с конфигурируемым CLI.
import { run } from '@modulify/conventional-release'
const result = await run()
if (!result.changed) {
console.log('Нет изменений с прошлого релиза')
} else {
for (const slice of result.slices) {
if (!slice.changed) continue
console.log(slice.id, slice.nextVersion, slice.tag)
}
}Пакет @modulify/conventional-release объединяет:
- рекомендации по версии из
@modulify/conventional-bump - запись changelog из
@modulify/conventional-changelog - обновление манифестов пакетов
- создание release-коммита и тегов
Этот пакет сознательно устроен как release core:
- он планирует release scope
- вычисляет версии
- обновляет файлы
- завершает релиз коммитом и тегами
Он не публикует пакеты в npm и не создаёт hosted releases в GitHub или GitLab. Такие delivery-шаги предполагаются уже в более верхнеуровневых инструментах поверх этого core.
Он также поставляет бинарник conventional-release, поэтому в потребляющем проекте можно использовать:
{
"scripts": {
"release": "conventional-release",
"release:dry": "conventional-release --dry"
}
}Полное описание API и CLI находится в README пакета: @modulify/conventional-release
@modulify/conventional-release предназначен для repository-local части релиза:
- определения affected packages
- построения release slices
- вычисления версий по истории коммитов
- обновления манифестов и changelog
- финализации релиза через commit и tags
Он не задуман как all-in-one delivery pipeline.
Если нужны npm publish, GitHub Releases, GitLab Releases или CI-специфичная деплойная обвязка,
ожидаемый путь — добавлять их отдельным orchestration-слоем поверх этого проекта.
Если нужен собственный release flow, низкоуровневые пакеты по-прежнему можно использовать напрямую:
import { Client } from '@modulify/conventional-git'
import { ReleaseAdvisor } from '@modulify/conventional-bump'
import { createWrite } from '@modulify/conventional-changelog'
import semver from 'semver'
const git = new Client()
const advisor = new ReleaseAdvisor({ git })
const currentVersion = await git.version() ?? '0.0.0'
const recommendation = await advisor.advise({
preMajor: semver.lt(currentVersion, '1.0.0')
})
if (recommendation) {
const nextVersion = semver.inc(currentVersion, recommendation.type)
const write = createWrite({ git, file: 'CHANGELOG.md' })
await write(nextVersion)
console.log(`Следующий релиз: ${nextVersion}`)
}Проект возник не как абстрактный эксперимент, а из практической потребности работать с глубоко вложенными деревьями workspaces, включая репозитории с двумя или тремя уровнями вложенности, тогда как большинство release-инструментов на рынке до сих пор предполагают плоскую или почти плоскую монорепу.
Локальная подготовка:
make .yarnrc.yml
yarn installПолезные команды:
make test
make test-coverage
make build
make typecheck
make eslintПредпросмотр релиза для этого репозитория:
yarn release:dry