在嵌套子文件夹中安装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中自动安装包的最佳方法是什么?
当前回答
find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && 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工作
用例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总是有效的。
接受的答案是有效的,但是你可以使用——prefix在选定的位置运行npm命令。
"postinstall": "npm --prefix ./nested_dir install"
——prefix适用于任何npm命令,而不仅仅是install。
还可以查看当前前缀with
npm prefix
并将全局安装(-g)文件夹设置为
npm config set prefix "folder_path"
也许是TMI,但你懂的…
正如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/”。
这也适用于纱线