我有一个带有“应用程序”和一个库的 angular monorepo,它作为它自己的 npm 包发布。这是在 CI 环境中自动完成的。到目前为止,库和应用程序是分开的,并且有单独的构建作业。现在它们是一起构建的,我面临的问题是每次构建(对 的每次更改master
)都会发布 lib,即使更改可能已经(并且很可能是)在应用程序中。
有没有一种直接的方法来只发布一个 npm 包,如果它的内容自上次发布以来发生了变化?
如果我运行npm info <the-package>
有一个.shasum
和.integrity
校验和,我希望我可以在运行时将它们与相同的值进行比较npm publish <directory> --dry-run
。不幸的是,这些命令会导致不同的校验和,即使包的内容完全相同。**
** 为了验证这一点,我将发布的 tarball 的内容与新构建的 dist/ 版本的 lib 进行了比较。两个目录上的 Adiff -r
显示没有差异。
更新
由于缺乏更好的想法,我在 bash 中编写了一个手动解决方案(因为无论如何我的 lib 的发布都是在 bash 脚本中发生的)。因为在我的情况下,每个版本都被标记,我得到最后一个标记的提交并检查从那时起库中是否有任何变化。这绝不是一个好的解决方案,您可能不应该使用它,但如果它对某人有帮助:
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
有一些明显的改进我现在不想解决:
- 该脚本应忽略出于发布以外的其他原因而标记的提交
- 最后一个版本应该以某种方式存储,否则不能保证您实际上正在检查自上次发布 lib 以来的最后一个版本
- 忽略某些不需要发布新版本的更改可能是有意义的