在嵌套子文件夹中安装npm包的最正确方法是什么?
my-app
/my-sub-module
package.json
package.json
当npm install在my-app中运行时,在/my-sub-module中自动安装包的最佳方法是什么?
在嵌套子文件夹中安装npm包的最正确方法是什么?
my-app
/my-sub-module
package.json
package.json
当npm install在my-app中运行时,在/my-sub-module中自动安装包的最佳方法是什么?
当前回答
添加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' })
})
其他回答
[macOS、Linux用户]:
我创建了一个bash文件来安装项目和嵌套文件夹中的所有依赖项。
find . -name node_modules -prune -o -name package.json -execdir npm install \;
解释:在根目录中,排除node_modules文件夹(即使在嵌套文件夹中),找到包含包的目录。Json文件,然后运行NPM install命令。
如果你只是想找到指定的文件夹(例如:abc123, def456文件夹),运行如下:
find ./abc123/* ./def456/* -name node_modules -prune -o -name package.json -execdir npm install \;
如果您知道嵌套子目录的名称,我更喜欢使用post-install。在package.json:
"scripts": {
"postinstall": "cd nested_dir && npm install",
...
}
如果你想在嵌套的子文件夹中运行一个命令来安装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工作
任何可以获取目录列表并运行shell命令的语言都可以为您完成此任务。
我知道这不是OP想要的答案,但这是一个永远有效的答案。你需要创建一个子目录名数组,然后循环遍历它们并运行npm i,或者任何你需要运行的命令。
作为参考,我尝试了npm I **/,它只是安装了父目录中所有子目录中的模块。这很不直观,但不用说,这不是你需要的解决方案。
正如fgblomqvist在评论中提到的,npm现在也支持工作区了。
有些答案相当古老。我认为现在我们有一些新的选择来建立单回购。
我建议使用纱线工作区:
工作区是一种设置包架构的新方法,从Yarn 1.0开始默认提供。它允许你设置多个包,这样你只需要运行一次yarn install就可以一次安装所有的包。
如果你更喜欢或不得不使用npm,我建议你看看lerna:
Lerna是一个工具,它优化了使用git和npm管理多包存储库的工作流。
Lerna也可以完美地使用纱线工作区。我刚刚完成了一个monorepo项目的设置-示例。
下面是一个配置为使用npm + lerna - MDC Web的多包项目的示例:他们使用package运行lerna引导。json是postinstall。