我有一个应用程序,这是一个网页游戏服务器,并说,例如我有node_modules,我在目录中使用./和我有一个适当的package.json为那些.碰巧,在目录./public/我有一个网站正在服务,它本身使用node_modules,也有一个适当的package.json为自己.我知道我可以通过导航目录来实现这一点,但是有没有一种命令或方法可以自动化这一点,以便其他开发人员更容易地在他们的系统中引导应用程序呢?
r7s23pms1#
假设您使用的是Linux/OSX,您可以尝试以下操作:find ./apps/* -maxdepth 1 -name package.json -execdir npm install \;论据:
find ./apps/* -maxdepth 1 -name package.json -execdir npm install \;
./apps/*-搜索的路径。我建议在这里非常具体,以避免它拾取其他 node_modules 目录中的package.json文件(参见下面的maxdepth)。-maxdepth 1-仅遍历搜索路径中的深度1(即当前目录-不进入子目录)-名称软件包.json-要在搜索中匹配的文件名-执行目录npm安装;-对于搜索中的每个结果,在保存文件的目录中运行 npm install(在本例中为 package.json)。注意,转义分号的反斜杠必须在JSON文件中进行转义。
把这个放在你的根 package.json 的postinstall钩子中,它会在你每次执行 npm install 时运行:
"scripts": { "postinstall": "find ./apps/* -name package.json -maxdepth 1 -execdir npm install \\;" }
shyt4zoc2#
对于跨平台支持(包括Windows),您可以尝试我的解决方案。Pure Node.js将其作为“preinstall”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)) }
2条答案
按热度按时间r7s23pms1#
假设您使用的是Linux/OSX,您可以尝试以下操作:
find ./apps/* -maxdepth 1 -name package.json -execdir npm install \;
论据:
./apps/*-搜索的路径。我建议在这里非常具体,以避免它拾取其他 node_modules 目录中的package.json文件(参见下面的maxdepth)。
-maxdepth 1-仅遍历搜索路径中的深度1(即当前目录-不进入子目录)
-名称软件包.json-要在搜索中匹配的文件名
-执行目录npm安装;-对于搜索中的每个结果,在保存文件的目录中运行 npm install(在本例中为 package.json)。注意,转义分号的反斜杠必须在JSON文件中进行转义。
把这个放在你的根 package.json 的postinstall钩子中,它会在你每次执行 npm install 时运行:
shyt4zoc2#
对于跨平台支持(包括Windows),您可以尝试我的解决方案。Pure Node.js
将其作为“preinstall”npm脚本运行