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

Und*_*ion 10 javascript package lerna monorepo npm-scripts

我有一个lerna repo,它包含以通常结构组织的多个包:

package.json
/packages
  - alpha
    package.json
  - bravo
    package.json
  - charlie
    package.json
Run Code Online (Sandbox Code Playgroud)

我需要转换所有包,我目前在每个包中都有以下脚本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/*"
Run Code Online (Sandbox Code Playgroud)

我目前使用以下命令运行构建:

lerna run build --stream --parallel
Run Code Online (Sandbox Code Playgroud)

但是,我不想为每个包复制这些脚本.我想在一个地方定义脚本,但是在所有包中使用它们.我目前在我的root包中有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"
},
Run Code Online (Sandbox Code Playgroud)

然后在root/scripts/build.sh:

#!/bin/sh 

babel src --out-dir lib --root-mode upward --ignore '**/*.test.js','**/__tests__' --watch --verbose 
Run Code Online (Sandbox Code Playgroud)

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

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

Old*_*Pro 6

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

  • @Undistraction将脚本放在包的bin目录中,然后在使用它们的包中将它们称为`./ node_modules/scriptpackage/bin/build.sh`. (2认同)