Как стать автором
Обновить

Комментарии 6

Извините, просто хочу уточнить. Если я правильно понимаю вот тут:
await spawnSync('yarn', ['global', 'add', 'lerna'], { shell: true });


await не нужен, это ведь синхронная функция?

… await readFile(PACK_JSON_PATH) чтобы работал, как предполагается, надо обернуть в util.promisify

И еще несколько мест таких в скрипте. Как он у вас работает?

Да. Спасибо за внимательность. Это урезанная версия оригинального скрипта. Чтобы не перегружать пример.
await в данном случае не нужен, но на работспособность он не влияет. так как await можно ставить и перед не Promise

Так как readFile/writeFile импортируются из namepsace promises никакой ошики нет и здесь. Обертка в promisify не требуется
const { existsSync, promises: { readFile, writeFile } } = require('fs');
Нечаянная встреча)
Вопрос не про масштабирование, а про Lerna. Как вы у себя используете версионность общих пакетов? Как обеспечили пересборку, повышение версий публикацию пакета и при этом не повышая версии во всех приложениях, которые эти пакеты используют?
Версия одна на все пакеты. Версия хранится в отдельном пакете (можно канонически хранить в `lerna.json`). Пакеты ссылаются друг на друга через * (прямая ссылка на файлы в монорепо). Публикация пакетов в npm registry в основном flow — не происходит.

Есть отдельный pipeline который раз в сутки (в ночь) публикует пакеты под единой версией для обратной совместимости с внешними по отношению к монорепо приложениями (но это вырожденные кейсы).

Если требуется постепенное внедрение какой то версии общего пакета, то публикуется текущая версия пакета (при этом lerna прописывает строгую версию во все зависимые пакеты).
По мере интеграции пакет за пакетом строгая версия заменяется на *, чтобы ссылаться на файлы пакета непосредственно в монорепо.

Итоговый артифакт — это docker image на каждое приложение протегированный единой вресией. Если пакеты того или иного приложения не менялись то переиспользуется старый image.

Очень странно, я уже пробовал и так и эдак и пришел к тому, что при изменении одной буковки в либе, пересобирать 15 других либ и 10 сервисов, как-то со всех сторон невыгодно.
В итоге я отсоединил приложения от лерны вообще, чтобы повышать версии пакетов только вручную. Изменил пакет и не ломаются сразу все приложения. Какие захотел (времени хватило), апнул и запушил.
А старые стабильные приложения работают месяцами и не меняются при изменении любого зависимого пакета.
Т.е. я приложения и пакеты храню в монорепе, но приложения не в лерна.джсон. А вот если я приложения захочу апнуть, я локально включаю его в лерну, тогда пакеты по симлинкам можно легко дописать, запаблишить и просто именно в этом приложении заюзать новую версию.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории