我是刚开始使用node js,我想递归地找到最接近的package.json。实际上,继续查找package.json,直到不会命中它。
我的文件夹树
root/
-contarats/
-proto/
some.proto
-package.json
"script": {
"contracts": "generate-some-contracts contracts/proto contracts",
}
const input = process.argv[2]
const settings = require(path.resolve(input, 'package.json'))
您是否正在寻找一种遍历目录的方法?如果是这样,这里有一个同步函数可以做到这一点
function search_sync(dir) {
var results = []
var list = fs.readdirSync(dir)
list.forEach(function(file) {
file = path.resolve(dir, file)
filename = file.split('\');
filename = filename[filename.length-1]
var stat = fs.statSync(file)
if (stat && stat.isDirectory()) results = results.concat(search_sync(file))
else if(filename == 'package.json')results.push(file)
})
return results
}
这将返回名为 package.json 的任何文件的数组及其完整文件路径。例如:
search_sync('./')
[C:UsersUserMyNodeProjectpackage.json,
C:UsersUserMyNodeProjectnpmsomeDependencypackage.json,
C:UsersUserMyNodeProjectnpmsomeOtherDependencypackage.json]
就个人而言,我会用它们的"\"字符分隔每一行,看看哪一行更接近我的根文件夹
查看您的目录树,package.json
文件不在 contracts/proto
中,而是在 contracts
中。(我认为contaracts
是一个错字。更改命令行上的第一个参数应该会有所帮助:
generate-some-contracts contracts contracts
尽管如此,您还是询问了对最近package.json
的递归搜索.NPM 在查找包根目录时会这样做。它从当前目录开始,然后跟随祖先,直到找到package.json
。一个读取和解析该package.json
的函数,类似于require
,可能看起来像这样:
const { readFile } = require('fs/promises')
const { join, resolve } = require('path')
async function loadPackageJson(cwd) {
const startDir = cwd || process.env.INIT_CWD || process.cwd()
let dir = startDir, prevDir
do {
try {
const path = join(dir, 'package.json')
const content = await readFile(path, 'utf8')
return JSON.parse(content)
} catch (err) {
if (err.code !== 'ENOENT') throw err
}
prevDir = dir
dir = resolve(dir, '..')
} while (prevDir !== dir)
throw new Error(`package.json not found in ${startDir} and its ancestors`)
}
function findParent(dir) {
if (fs.existsSync(path.join(dir, 'package.json'))) {
return dir;
}
const parentDir = path.resolve(dir, '..');
if (dir === parentDir) {
return null;
}
return findParent(parentDir);
}
const parentDir = findParent(__dirname);
const filePath = path.normalize(`${parentDir}/package.json`);
const settings = require(filePath);