如何在 Lerna 包中共享构建脚本

How to Share Build Scripts In Lerna Packages

我有一个 lerna 存储库,其中包含以通常结构组织的多个包:

package.json
/packages
  - alpha
    package.json
  - bravo
    package.json
  - charlie
    package.json

我需要转译所有包,我目前在每个包的 package.json:

中都有以下脚本
"build": "npm run build:noWatch -- --watch --verbose",
"build:noWatch": "babel src --out-dir lib --root-mode upward --ignore '**/*.test.js','**/__tests__'",
"prebuild": "rimraf lib/*"

我目前 运行 构建使用:

lerna run build --stream --parallel

但是我不想为每个包都复制这些脚本。我想在一个地方定义脚本,但从所有包中使用它们。我目前在我的根包中有 linting 脚本和测试脚本,它们在那里很有意义,因为它们有效地遍历整个 monorepo 寻找测试或文件以进行 lint。将构建脚本移到那里似乎没有意义,因为它们的范围仅限于各个包,而且我喜欢这样一个事实,即当我使用 lerna run 时,每个包都会得到不同的颜色输出。

一个不令人满意的解决方案是在 monorepo 的根目录中创建一些 shell 脚本并从包的 package.json 文件中调用它们:

root/packages/example/package.json中:

"scripts": {
  "build": "../../scripts/build.sh",
  "build:noWatch": "../../scripts/build.sh",
  "prebuild": "../../scripts/prebuild.sh"
},

然后在 root/scripts/build.sh:

#!/bin/sh 

babel src --out-dir lib --root-mode upward --ignore '**/*.test.js','**/__tests__' --watch --verbose 

虽然这有效,但感觉不对:它仍然涉及包之间的重复,并且需要在 shell 脚本上设置权限(这使 CI 复杂化)。

是否有更好的方法在我的所有包中共享这些命令?

将所有构建脚本打包到它们自己的模块中,然后使用 lerna --hoist 托管通用模块,这样它只安装一次但可用于所有其他包。