11

我有一个 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 复杂化)。

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

4

1 回答 1

7

Package all the build scripts into their own module and then use lerna --hoist to host the common module so it is installed once but available to all the other packages.

于 2018-12-05T22:01:05.937 回答