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

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

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


当前回答

如果你想在嵌套的子文件夹中运行一个命令来安装npm包,你可以通过npm和main package运行一个脚本。Json在根目录中。脚本将访问每个子目录并运行npm install。

下面是一个.js脚本,将实现预期的结果:

var fs = require('fs');
var resolve = require('path').resolve;
var join = require('path').join;
var cp = require('child_process');
var os = require('os');
    
// get library path
var lib = resolve(__dirname, '../lib/');
    
fs.readdirSync(lib).forEach(function(mod) {
    var modPath = join(lib, mod);
    
    // ensure path has package.json
    if (!fs.existsSync(join(modPath, 'package.json'))) {
        return;
    }

    // npm binary based on OS
    var npmCmd = os.platform().startsWith('win') ? 'npm.cmd' : 'npm';

    // install folder
    cp.spawn(npmCmd, ['i'], {
        env: process.env,
        cwd: modPath,
        stdio: 'inherit'
    });
})

请注意,这是取自StrongLoop文章的示例,该文章专门处理模块化node.js项目结构(包括嵌套组件和包)。json文件)。

如前所述,您也可以使用bash脚本实现相同的功能。

编辑:使代码在Windows工作

其他回答

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

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

如果你想在嵌套的子文件夹中运行一个命令来安装npm包,你可以通过npm和main package运行一个脚本。Json在根目录中。脚本将访问每个子目录并运行npm install。

下面是一个.js脚本,将实现预期的结果:

var fs = require('fs');
var resolve = require('path').resolve;
var join = require('path').join;
var cp = require('child_process');
var os = require('os');
    
// get library path
var lib = resolve(__dirname, '../lib/');
    
fs.readdirSync(lib).forEach(function(mod) {
    var modPath = join(lib, mod);
    
    // ensure path has package.json
    if (!fs.existsSync(join(modPath, 'package.json'))) {
        return;
    }

    // npm binary based on OS
    var npmCmd = os.platform().startsWith('win') ? 'npm.cmd' : 'npm';

    // install folder
    cp.spawn(npmCmd, ['i'], {
        env: process.env,
        cwd: modPath,
        stdio: 'inherit'
    });
})

请注意,这是取自StrongLoop文章的示例,该文章专门处理模块化node.js项目结构(包括嵌套组件和包)。json文件)。

如前所述,您也可以使用bash脚本实现相同的功能。

编辑:使代码在Windows工作

接受的答案是有效的,但是你可以使用——prefix在选定的位置运行npm命令。

"postinstall": "npm --prefix ./nested_dir install"

——prefix适用于任何npm命令,而不仅仅是install。

还可以查看当前前缀with

npm prefix

并将全局安装(-g)文件夹设置为

npm config set prefix "folder_path"

也许是TMI,但你懂的…

find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && npm install" \;

根据@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)"
  },
}