npm 仅在 Angular monorepo 中更改时发布

Chr*_*tof 5 npm monorepo angular

我有一个带有“app”和一个库的 Angular monorepo,它作为自己的 npm 包发布。这是在 CI 环境中自动完成的。到目前为止,库和应用程序都是分开的,并且有单独的构建作业。现在它们是一起构建的,我面临的问题是每次构建(对 的每次更改master)都会发布库,即使更改可能已经(并且很可能是)在应用程序中。

如果 npm 包的内容自上次发布以来发生了更改,是否有一种简单的方法来仅发布该包?

如果我运行,npm info <the-package>会有一个.shasum.integrity校验和,我希望在运行时可以将它们与相同的值进行比较npm publish <directory> --dry-run。不幸的是,即使包的内容完全相同,这些命令也会产生不同的校验和。**

** 为了验证这一点,我将发布的 tarball 的内容与新构建的 dist/ 版本的库进行了比较。两个目录上的Adiff -r没有显示任何差异。

更新

由于缺乏更好的想法,我在 bash 中编写了一个手动解决方案(因为无论如何我的库的发布都是在 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
Run Code Online (Sandbox Code Playgroud)

有一些明显的改进,我现在并不想解决:

  • 脚本应该忽略因发布以外的其他原因标记的提交
  • 最后一个版本应该以某种方式存储,否则无法保证您实际上正在检查自上次发布库以来的最后一个版本
  • 忽略某些不需要发布新版本的更改可能是有意义的

小智 1

自 npm@8 以来,出现了一个新命令diff。我认为应该可以解决问题。

https://docs.npmjs.com/cli/v8/commands/npm-diff

import { exec } from 'child_process';

exec(`cd ${yourPackageFolder} && npm diff --diff-name-only=true`, (err, stdout)=>{
  if( stdout !== '\n'){
    // execute publish command
  }
})

Run Code Online (Sandbox Code Playgroud)