2

背景:

我有一个带有两个包的纱线工作区的 lerna monorepo。我使用汇总作为捆绑器。

包/模块1/package.json:

{
  scripts: {
    "watch": "rollup -c rollup.config.js --watch",
    "build": "NODE_ENV=production && rollup -c rollup.config.js"
  }
}

包/模块2/package.json:

{
  scripts: {
    "watch": "rollup -c rollup.config.js --watch",
    "build": "NODE_ENV=production && rollup -c rollup.config.js"
  }
}

预期行为:

  1. lerna run build将为每个包运行build脚本。
  2. lerna run watch将以watch监视模式运行每个包的脚本。

当前行为:

  1. lerna run build按预期工作。该build脚本对这两个包都正确运行。
  2. lerna run watch就挂在那里:
lerna notice cli v3.13.1
lerna info Executing command in 2 packages: "yarn run watch"
[[just hangs here]]

我试过了lerna run --parallel watch这只运行一次。它在汇总完成后退出。换句话说,它似乎从来没有在看。

4

2 回答 2

8

我相信您正在寻找的命令是lerna exec. 这将在 Monorepo 中的每个包上运行传递给它的任何命令。

lerna exec --parallel -- yarn build

如果每个包都有相同的构建步骤,您可以将其抽象到顶层package.json,如下所示:

lerna exec --parallel -- rollup -c=rollup.config.js

它将进入每个包并运行该汇总命令。


资料来源:

于 2019-04-12T16:13:01.023 回答
0

它将需要一些调整以使汇总能够并行监视 lerna monorepo。

lerna run --parallel watch

上面的代码只会为一个包运行并阻止其余的包,这里是汇总内部工作的代码。以下代码片段是汇总 github 代码库中的 Watcher 类构造函数。如您所见,观察者实际上接受了一组配置。因此,现在您只需要编写一些包装代码来将所有配置合并到一个中,然后从所有包的相同配置中运行监视。

constructor(configs: GenericConfigObject[] | GenericConfigObject) {
    this.emitter = new (class extends EventEmitter implements RollupWatcher {
        close: () => void;
        constructor(close: () => void) {
            super();
            this.close = close;
            // Allows more than 10 bundles to be watched without
            // showing the `MaxListenersExceededWarning` to the user.
            this.setMaxListeners(Infinity);
        }
    })(this.close.bind(this));
    this.tasks = (Array.isArray(configs) ? configs : configs ? [configs] : []).map(
        config => new Task(this, config)
    );
    this.running = true;
    process.nextTick(() => this.run());
}
于 2019-11-16T03:44:10.913 回答