С семантический релиз и Лерна Появился, сообщество сделало несколько попыток объединить эти технологии вместе. Один не просто бегает релиз параллельно. Есть несколько значительных препятствий. Первый – это Анализатомиты шаг. семантический релиз пытается разрешить новую версию, создавая обрезки от предыдущего тега выпуска в REPO, но не имеет представления, как эти изменения связаны с пакетами. Второй вопрос Опубликовать Отказ Или Подготовьте Отказ Или, скорее, Что происходит между Отказ
await plugins.prepare(context);
if (options.dryRun) {
logger.warn(`Skip ${nextRelease.gitTag} tag creation in dry-run mode`);
} else {
// Create the tag before calling the publish plugins as some require the tag to exists
await tag(nextRelease.gitTag, nextRelease.gitHead, {cwd, env});
await addNote({channels: [nextRelease.channel]}, nextRelease.gitHead, {cwd, env});
await push(options.repositoryUrl, {cwd, env});
await pushNotes(options.repositoryUrl, {cwd, env});
logger.success(`Created tag ${nextRelease.gitTag}`);
}
const releases = await plugins.publish(context);
Когда эти Git Add. , Git Commit -M и Git push --tags light очередей из нескольких асинхронных «нитей» столкновения во время выполнения, они дают раскрытые изменения и блокировать друг друга. Третья проблема – это перекрестные зависимости. В большинстве случаев соединены монореспортировочные пакеты, поэтому необходимо каким-то образом обновлять версии этих ссылок.
2015
Atlassian/Lerna-Semantic-release Если я не ошибаюсь, кажется, это было первое рабочее решение. Ключевое представление о ЛСР это разобрать семантический релиз Для деталей и используйте их, чтобы построить несколько позжеподобных трубопроводов и запустить их с помощью Лерна
# Pre lerna-semantic-release pre # Set up the versions, tags and commits # Perform lerna-semantic-release perform # Publishes to npm # Post lerna-semantic-release post # Generates a changelog in each package
Под капотом мы видим Пользовательские коммиты анализатора , Пользовательский изменяемый генератор , Пользовательский NPM Publisher и так далее. К сожалению, этот дизайн инструмента не предоставляет стандартные Семел Расширение функций и любые другие функции поддержки плагинов. Более того, один раз Семел Изменяет свои унылы, это резко влияет Lrs Отказ Тем не менее, это стоило попробовать.
2017
PMOWRER/SEMANTINGE-RELEASE-MONOREPO Другой подход был предложен Патрик Моурер . Он не пытался преодолеть ограничения параллельного бега и предложил проводить релизы последовательно.
lerna exec --concurrency 1 -- npx --no-install semantic-release -e semantic-release-monorepo
Важный шаг вперед был использование Семел Стандарт Техника расширения Отказ По сути, только один плагин требует настройки – Анализатомиты который был дополнен Фильтрация Cond-by-Package Отказ Некоторые недостатки внедрения легко исправлены с помощью Дополнительный крючок , но … Проблема с перекрестной зависимостью вообще не рассматривалась.
2019
Dhoulb/Multi-Semantic-Release Дейв Хулбрук сосредоточен на имплантации точек синхронизации внутри потока выпуска. Если мы не может не следует изменить Семел Код бегуна, мы можем написать плагин, который обеспечит состояние когерентности параллельных потоков. Каждый шаг синтетического Встроенный плагин впрыскивает условия ожидания Чтобы убедиться, что все одновременные релизы находятся на одной фазе.
async function generateNotes(pluginOptions, context) {
// Set nextRelease for package.
pkg._nextRelease = context.nextRelease;
// Wait until all todo packages are ready to generate notes.
await wait(() => todo().every(p => p.hasOwnProperty("_nextRelease")));
Но этого недостаточно просто для хранения параллельных выпусков на одном шаге. Некоторые действия, как мы знаем, ложь между плагин [шаг] звонки. И с умеренно большим количеством пакетов снова появится проблема раскрытых изменений. Тем не менее, оказалось, что этот вопрос можно легко исправить, заменив внутренние асинхронные звонки с синхронные . Функция убийцы этого решения является обновление по перекрестным зависимым. MSR Общий Milticontext знает о том, какие пакеты будут обновлены как часть всех выпусков, так что это возможно Обновите все файлы манифеста слишком.
// Loop through localDeps to update dependencies/devDependencies/peerDependencies in manifest.
pkg._localDeps.forEach(d => {
// Get version of dependency.
const release = d._nextRelease || d._lastRelease;
// Cannot establish version.
if (!release || !release.version)
throw Error(`Cannot release because dependency ${d.name} has not been released`);
// Update version of dependency in manifest.
if (manifest.dependencies.hasOwnProperty(d.name)) manifest.dependencies[d.name] = release.version;
if (manifest.devDependencies.hasOwnProperty(d.name)) manifest.devDependencies[d.name] = release.version;
if (manifest.peerDependencies.hasOwnProperty(d.name))
manifest.peerDependencies[d.name] = release.version;
});
2020
Qiwi/Multi-Semantic-release Решение Дейва отлично работает для небольшого количества пакетов (<20). Но реализованный механизм, который блокирует, выпускает фазы, чрезвычайно медленнее для огромных «предприятия» монореспонца. Эта вилка Dhoulb/Multi-Semantic-Release заменяет setimmediate петли и упомянул execa.sync крючок с поток, управляемый событием И, наконец, делает возможным запустить большинство операций выпуска параллельно.
// Shared signal bus.
const ee = new EventEmitter();
// Announcement of readiness for release.
todo().forEach((p) => (p._readyForRelease = ee.once(p.name)));
// Status sync point.
const waitFor = (prop, filter = identity) => {
const promise = ee.once(prop);
if (
todo()
.filter(filter)
.every((p) => p.hasOwnProperty(prop))
) {
ee.emit(prop);
}
return promise;
};
...
const publish = async (pluginOptions, context) => {
pkg._prepared = true;
const nextPkgToProcess = todo().find((p) => p._nextType && !p._prepared);
if (nextPkgToProcess) {
ee.emit(nextPkgToProcess.name);
}
// Wait for all packages to be `prepare`d and tagged by `semantic-release`
await waitFor("_prepared", (p) => p._nextType);
202x.
Там много MonoRepo связанные вопросы в Семел репо. Намерение NPM стандартизирует Обозначение рабочей области Приносит умеренный оптимизм о судьбе монорепс. Как только монорепс станет более распространенной практикой, Семел вероятно, добавлю встроенную поддержку для них.
Оригинал: “https://dev.to/antongolub/the-chronicles-of-semantic-release-and-monorepos-5cfc”