-1

我想组织一个大型 NPM monorepo,以便我可以根据类别或模式在许多(但不是全部)工作区上运行命令。

这可以是子目录,也可以是工作区名称中的模式,如前缀或后缀,但我看不到任何单独在 NPM 中的方法。


Yarn >= 2中,这可以使用带有全局模式的--includeor--exclude标志yarn workspaces foreach,例如:

yarn workspaces foreach --include "@namespace/plugin-*" --include "@namespace/preset-*" run build

...并且使用该名称空间和plugin-orpreset-前缀构建您的所有工作区。


lerna中,该--scope标志还采用了允许模式的 glob,例如:

lerna run --scope "@namespace/plugin-*" --scope "@namespace/preset-*" run build

但是在NPM中,据我所知,在 NPM 的v7v8工作区文档中,它似乎没有相同的功能:

  • 它有一个标志--workspace,可以多次使用来创建一个数组,但似乎只接受确切的工作区名称,
  • ...和一个似乎在所有工作区中运行的标志--workspaces

...但是我看不到任何方法可以在目录中的所有工作区或与模式匹配的所有工作区上运行。我真的不想在每个脚本中按名称列出每个工作区,因为它们会很多。

4

1 回答 1

0

NPM 可以使用该标志将工作空间命令过滤到工作空间的子目录。--workspace例如:

npm run --workspace packages/presets --workspace packages/plugins build

使用 package.json 中定义的工作空间,例如:

  "workspaces": [
    "packages/plugins/*",
    "packages/presets/*",
    ...more
  ],

...或定义如下:

  "workspaces": [
    "packages/**",
    ...more
  ],

指向--workspace工作区的子目录而不是像这样的单个工作区似乎没有在任何地方记录,但我在其中一个 rfcs 中发现了一个建议它的注释:

注意:不支持将 Glob 作为有效的 --workspace 参数值,建议的替代方法是使用 npm --workspace= 其中包含多个工作区的文件夹。

我找不到任何明确说明该提案已实施的内容,但我尝试将我的 monorepo 重新组织到子目录中并使用带有--workspace标志的子目录,并且它起作用了。

他们在全局模式之前选择这种方法的原因似乎是因为:

在各种受支持的 shell 和操作系统中支持 glob 的许多陷阱

于 2022-03-04T11:19:23.637 回答