4

我有一个带有“应用程序”和一个库的 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 以来的最后一个版本
  • 忽略某些不需要发布新版本的更改可能是有意义的
4

0 回答 0