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

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

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


当前回答

正如fgblomqvist在评论中提到的,npm现在也支持工作区了。


有些答案相当古老。我认为现在我们有一些新的选择来建立单回购。

我建议使用纱线工作区:

工作区是一种设置包架构的新方法,从Yarn 1.0开始默认提供。它允许你设置多个包,这样你只需要运行一次yarn install就可以一次安装所有的包。

如果你更喜欢或不得不使用npm,我建议你看看lerna:

Lerna是一个工具,它优化了使用git和npm管理多包存储库的工作流。

Lerna也可以完美地使用纱线工作区。我刚刚完成了一个monorepo项目的设置-示例。

下面是一个配置为使用npm + lerna - MDC Web的多包项目的示例:他们使用package运行lerna引导。json是postinstall。

其他回答

要在每个子目录上运行npm install,你可以这样做:

"scripts": {
  ...
  "install:all": "for D in */; do npm install --cwd \"${D}\"; done"
}

在哪里

安装:所有只是脚本的名称,你可以随意命名

当前迭代的目录名

*/指定要查找子目录的位置。目录/*/将列出目录/内的所有目录,目录/*/*/将列出两层中的所有目录。

在指定文件夹中安装所有依赖项

你也可以运行一些命令,例如:

D在*/;&& npm install——cwd \"${D}\";完成

每次迭代都会打印“Installing stuff on your_subfolder/”。

这也适用于纱线

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

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

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

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

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

添加Windows支持snozza的答案,以及跳过node_modules文件夹如果存在。

var fs = require('fs')
var resolve = require('path').resolve
var join = require('path').join
var cp = require('child_process')

// 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 (!mod === 'node_modules' && !fs.existsSync(join(modPath, 'package.json'))) return

    // Determine OS and set command accordingly
    const cmd = /^win/.test(process.platform) ? 'npm.cmd' : 'npm';

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

正如fgblomqvist在评论中提到的,npm现在也支持工作区了。


有些答案相当古老。我认为现在我们有一些新的选择来建立单回购。

我建议使用纱线工作区:

工作区是一种设置包架构的新方法,从Yarn 1.0开始默认提供。它允许你设置多个包,这样你只需要运行一次yarn install就可以一次安装所有的包。

如果你更喜欢或不得不使用npm,我建议你看看lerna:

Lerna是一个工具,它优化了使用git和npm管理多包存储库的工作流。

Lerna也可以完美地使用纱线工作区。我刚刚完成了一个monorepo项目的设置-示例。

下面是一个配置为使用npm + lerna - MDC Web的多包项目的示例:他们使用package运行lerna引导。json是postinstall。