我如何安装npm当前目录和子目录与package.json文件?

我有一个应用程序,这是一个网页游戏服务器,并说例如我有node_modules,我在目录中使用./和我有一个适当的package.json这些。 它发生在目录./public/我有一个网站正在服务本身使用node_modules,也有一个适当的package.json本身。

我知道我可以通过浏览目录来做到这一点。 但是有没有一个命令或方法来自动执行此操作,以便其他开发人员可以更轻松地在系统中引导应用程序?

假设你在Linux / OSX,你可以尝试这样的事情:

find ./apps/* -maxdepth 1 -name package.json -execdir npm install \;

参数:

./apps/* – searchpath。 我build议在这里非常具体,以避免它拾取其他node_modules目录中的package.json文件(请参阅下面的maxdepth)。

-maxdepth 1 – 仅在searchpath中遍历1的深度(即当前目录 – 不要进入子目录)

-name package.json – 要在search中匹配的文件名

-execdir npm install \; – 对于search中的每个结果,在保存文件的目录(在本例中为package.json )中运行npm install 。 请注意,转义分号的反斜杠必须在JSON文件中自行转义。

把它放在你的根package.json中的postinstall钩子里,每当你做一个npm安装的时候它就会运行:

 "scripts": { "postinstall": "find ./apps/* -name package.json -maxdepth 1 -execdir npm install \\;" } 

对于跨平台支持(包括Windows),您可以尝试我的解决scheme。 纯粹的Node.js

将其作为“预安装”npm脚本运行

 const path = require('path') const fs = require('fs') const child_process = require('child_process') const root = process.cwd() npm_install_recursive(root) function npm_install_recursive(folder) { const has_package_json = fs.existsSync(path.join(folder, 'package.json')) if (!has_package_json && path.basename(folder) !== 'code') { return } // Since this script is intended to be run as a "preinstall" command, // skip the root folder, because it will be `npm install`ed in the end. if (has_package_json) { if (folder === root) { console.log('===================================================================') console.log(`Performing "npm install" inside root folder`) console.log('===================================================================') } else { console.log('===================================================================') console.log(`Performing "npm install" inside ${folder === root ? 'root folder' : './' + path.relative(root, folder)}`) console.log('===================================================================') } npm_install(folder) } for (let subfolder of subfolders(folder)) { npm_install_recursive(subfolder) } } function npm_install(where) { child_process.execSync('npm install', { cwd: where, env: process.env, stdio: 'inherit' }) } function subfolders(folder) { return fs.readdirSync(folder) .filter(subfolder => fs.statSync(path.join(folder, subfolder)).isDirectory()) .filter(subfolder => subfolder !== 'node_modules' && subfolder[0] !== '.') .map(subfolder => path.join(folder, subfolder)) }