Пряжа + Lerna + Angular Libs = сломанная публикация?

reHi!

Вот в чем дело, у нас есть монорепозиторий. Мы используем Lerna & Yarn с кучей библиотек Angular.

В каждом package.json для пакетов / библиотек у нас есть что-то вроде:

"prepublishOnly": "yarn build <library name goes here>"

Yarn работает для рабочих пространств yarn install, делает то, что делает. Поскольку мы используем рабочие области, они создают символические ссылки на пакеты. Например, если у нас есть пакет с именем @foo/bar на верхнем уровне node_modules, у нас будет node_modules/@foo/bar символическая ссылка на libs/foo-bar.

В Yarn Workspaces все в порядке, за исключением того, что материал в node_modules/@foo/bar не готов к публикации. Во-первых, нам нужно собрать пакет с помощью компилятора Angular CLI.

Мы достигаем этого с помощью уже упомянутого prepublishOnly сценария в package.json.

Работает, когда нужно собрать все пакеты. Поток идет:

  1. yarn install - Создает магию символической ссылки / рабочего пространства.
  2. lerna publish --contents dist - Создает магию монорепо. Лерна увидит, что все пакеты были изменены, и запустит prepublishOnly для всех пакетов. Таким образом, то, что находится в node_modules/@foo, будет законными пакетами NPM (вывод Angular CLI, создающий библиотеки)

Проблема в том, что в одной библиотеке есть модификация.

  1. yarn install - Создает магию символической ссылки / рабочего пространства. Все элементы в node_modules/@foo будут символическими ссылками на libs/<package-name>, которые на данный момент являются исходными файлами. Не пакеты NPM
  2. lerna publish --contents dist - Запускается ... и идет Ой, только Пакет А изменился. Так что позвольте мне побороться с этим. Lerna потерпит неудачу из-за того, что другие пакеты внутри node_modules НЕ являются законными пакетами NPM.

Мне нужно выяснить, как:

  1. Всегда собирайте все пакеты при публикации ИЛИ
  2. Как-то использовать пакеты из реестра NPM в процессе сборки

Я чувствую, что где-то упускаю что-то простое.

Если есть примеры, которые я могу привести, чтобы помочь объяснить, спросите.


person Charlie    schedule 25.09.2020    source источник


Ответы (1)


Всегда собирайте все пакеты при публикации

в вашем корневом package.json (учитывая, что у вас lerna как зависимость от разработчика)

{
 "scripts": {
     "publish-ci": "lerna run build && lerna publish --content dist"
  }
}

в вашей библиотеке1 пакеты

 "scripts": {
     "build": "yarn build library1"
  }

теперь вы можете запустить yarn publish-ci в своей корневой папке, и все будет построено и опубликовано.

вы также можете использовать флаг lerna publish --from-package для публикации только измененного пакета.

Как-то использовать пакеты из реестра NPM в процессе сборки

Здесь вам нужна lerna только для измененных пакетов, а не для публикации, хакерский способ получить это

в вашем корневом package.json

{
 "scripts": {
     "publish-ci": "node custom.publish.js"
  }
}

в custom.publish.js


var { execSync } = require("child_process");
let packagesChangedString = execSync("yarn lerna changed --toposort --json --loglevel silent").toString();
let packageChanged = JSON.parse(packagesChangedString.substring(packagesChangedString.indexOf("["), packagesChangedString.lastIndexOf("]") + 1));
console.log(packageChanged);

packageChanged.forEach(changed => {
    // exec npm publish manually without using lerna for publishing. 
    execSync("cd " + changed.location + " && npm publish" );

});

person Sengupta Amit    schedule 01.10.2020