我有一个应用程序,它是一个网页游戏服务器,并说例如我有node_modules我在目录./中使用,我有一个适当的package.json为那些。它发生在目录./public/我有一个服务的网站,它本身使用node_modules并且还有一个适当的package.json本身。
我知道我可以通过导航目录来完成这项工作。但是有没有一个命令或方法来自动化这个,以便其他开发人员更容易在他们的系统中引导应用程序?
答案 0 :(得分:16)
假设你使用的是Linux / OSX,你可以尝试这样的事情:
find ./apps/* -maxdepth 1 -name package.json -execdir npm install \;
参数:
./ apps / * - 搜索路径。我建议在这里非常具体,以避免它在其他 node_modules 目录中获取package.json文件(参见下面的maxdepth)。
-maxdepth 1 - 仅在搜索路径中遍历深度1(即当前目录 - 不进入子目录)
-name package.json - 要在搜索中匹配的文件名
-execdir npm install \; - 对于搜索中的每个结果,在包含该文件的目录中运行 npm install (在本例中为包。 JSON )。请注意,转义分号的反斜杠必须在JSON文件中自行转义。
将它放在root package.json 的postinstall挂钩中,每次执行 npm install 时它都会运行:
"scripts": {
"postinstall": "find ./apps/* -name package.json -maxdepth 1 -execdir npm install \\;"
}
答案 1 :(得分:0)
对于跨平台支持(包括Windows),您可以尝试我的解决方案。 Pure 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))
}