在嵌套子文件夹中安装npm包的最正确方法是什么?

my-app
  /my-sub-module
  package.json
package.json

当npm install在my-app中运行时,在/my-sub-module中自动安装包的最佳方法是什么?


当前回答

如果你在你的系统上找到了实用程序,你可以尝试在你的应用程序根目录下运行以下命令: 找到。! -path "*/node_modules/*" -name "包。-execdir NPM install \;

基本上,找到所有的包。Json文件,并在该目录下运行NPM install,跳过所有node_modules目录。

其他回答

任何可以获取目录列表并运行shell命令的语言都可以为您完成此任务。

我知道这不是OP想要的答案,但这是一个永远有效的答案。你需要创建一个子目录名数组,然后循环遍历它们并运行npm i,或者任何你需要运行的命令。

作为参考,我尝试了npm I **/,它只是安装了父目录中所有子目录中的模块。这很不直观,但不用说,这不是你需要的解决方案。

如果你在你的系统上找到了实用程序,你可以尝试在你的应用程序根目录下运行以下命令: 找到。! -path "*/node_modules/*" -name "包。-execdir NPM install \;

基本上,找到所有的包。Json文件,并在该目录下运行NPM install,跳过所有node_modules目录。

用例1:如果你想在每个子目录中运行npm命令(每个包。Json是),你将需要使用postinstall。

因为我经常使用npm-run-all,我用它来保持它的美观和简短(在postinstall的部分):

{
    "install:demo": "cd projects/demo && npm install",
    "install:design": "cd projects/design && npm install",
    "install:utils": "cd projects/utils && npm install",

    "postinstall": "run-p install:*"
}

这有一个额外的好处,我可以一次性安装,或单独安装。如果你不需要这个或者不希望npm-run-all作为依赖项,请查看demisx的答案(在postinstall中使用subshell)。

用例2:如果你将从根目录运行所有的npm命令(并且,例如,不会在子目录中使用npm脚本),你可以简单地安装每个子目录,就像你安装任何依赖一样:

npm install path/to/any/directory/with/a/package-json

在后一种情况下,如果您找不到任何node_modules或package-lock,请不要感到惊讶。所有的包都将安装在根目录node_modules中,这就是为什么你不能从你的任何子目录运行你的NPM命令(需要依赖)。

如果您不确定,用例1总是有效的。

根据@Scott的回答,只要知道子目录名,安装|postinstall脚本是最简单的方法。这就是我如何对多个子dirs运行它。例如,假设我们在monorepo根目录下有api/、web/和shared/子项目:

// In monorepo root package.json
{
...
 "scripts": {
    "postinstall": "(cd api && npm install); (cd web && npm install); (cd shared && npm install)"
  },
}

在Windows上,替换;在圆括号&&之间。

// In monorepo root package.json
{
...
 "scripts": {
    "postinstall": "(cd api && npm install) && (cd web && npm install) && (cd shared && npm install)"
  },
}

如果您知道嵌套子目录的名称,我更喜欢使用post-install。在package.json:

"scripts": {
  "postinstall": "cd nested_dir && npm install",
  ...
}