npm публикуют только если изменено в угловых монорепо
У меня есть угловой монорепо с приложением и библиотекой, которая публикуется в виде собственного пакета npm. Это делается автоматически в среде CI. До сих пор библиотека и приложение были отдельными и имели отдельные задания по сборке. Теперь, когда они собраны вместе, я столкнулся с проблемой, что библиотека публикуется при каждой сборке (каждое изменение master
), хотя изменение могло быть (и, скорее всего, так) в приложении.
Есть ли простой способ опубликовать пакет npm, если его содержимое изменилось с момента последней публикации?
Если я бегу npm info <the-package>
есть .shasum
а также .integrity
контрольная сумма, и я надеялся, что смогу сравнить их с теми же значениями при запуске npm publish <directory> --dry-run
, К сожалению, эти команды приводят к разным контрольным суммам, хотя содержимое пакетов в точности совпадает. **
** чтобы убедиться в этом, я сравнил содержимое опубликованного архива с недавно созданной дистрибутивной версией библиотеки. diff -r
по обоим каталогам не выявлено различий.
Обновить
Из-за отсутствия лучшей идеи я взломал ручное решение в bash (поскольку публикация моей библиотеки в любом случае происходит в bash-скрипте). Поскольку в моем случае каждый релиз помечен тегом, я получаю последний помеченный коммит и проверяю, изменилось ли что-либо в lib с тех пор. Это ни в коем случае не хорошее решение, и вы, вероятно, не должны его использовать, но в случае, если оно кому-то поможет:
PATH_TO_LIB='./projects/the-lib'
# find the last tagged commit and assume it was the last release
TAG=$(git describe --abbrev=0)
COMMIT=$(git rev-list -n 1 $TAG)
# check if anything changed in the lib since the last release
CHANGED=$(git diff --name-only HEAD $COMMIT $PATH_TO_LIB)
if [ ! -n "$CHANGED" ]; then
exit 0
fi
Есть несколько очевидных улучшений, которые я сейчас не хочу решать:
- скрипт должен игнорировать коммиты, которые были помечены по другой причине, чем релиз
- последний выпуск должен быть как-то сохранен, в противном случае нет никакой гарантии, что вы действительно проверяете последний выпуск с момента последней публикации библиотеки
- может иметь смысл игнорировать определенные типы изменений, которые не требуют нового выпуска
1 ответ
Поскольку [email protected] появилась новая командаdiff
. Я думаю, что это должно решить проблему.
import { exec } from 'child_process';
exec(`cd ${yourPackageFolder} && npm diff --diff-name-only=true`, (err, stdout)=>{
if( stdout !== '\n'){
// execute publish command
}
})