递归查找最近的 package.json node.js



我是刚开始使用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);

相关内容

  • 没有找到相关文章

最新更新