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

时间:2018-12-03 19:23:10

标签: javascript package npm-scripts lerna monorepo

我有一个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来寻找测试或要生成文件的文件。将构建脚本移到那里以及将它们限制在各个包中似乎没有任何意义,而且我喜欢这样的事实,当我使用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复杂化)。

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

1 个答案:

答案 0 :(得分:5)

将所有构建脚本打包到各自的模块中,然后使用lerna --hoist托管公共模块,以便将其安装一次,但可用于所有其他软件包。