如何为 config/rc 个文件确定项目的根目录

How to determine the root directory of a project for config/rc files

我正在用 Node 编写一个 CLI 工具,我希望它在消费者项目使用时可以通过配置文件进行配置。与 es-lint 的 .eslintrc 或 babel .bablerc 的工作方式非常相似。

consumer-app
  node_modules
    my-cli-tool
      index.js ← my tool
  .configfile ← configuration file for the cli tool
  package.json

这些文件通常放在项目的根目录下,有时您可以在文件树的不同级别有多个配置文件。

consumer-app
  sub-directory
    .configfile ← another configuration file for this sub-dir
  node_modules
    my-cli-tool
      index.js ← my tool
  .configfile ← configuration file
  package.json

构建类似的东西的总体架构是什么?我可以让我的模块查找它的配置文件 - 但我很难找到这些配置文件或项目的根目录,因为它们最有可能位于那里。

我能够通过在给定 __dirname 的树上查找配置文件来解决这个问题。

下面的这个方法获取一个文件名并向上扫描 __dirname 所属的每个目录的树,直到找到给定的文件。这也使得每个目录都有自己的配置文件成为可能。

function getRootFile(filename) {
  return new Promise((resolve, reject) => {
    let lastFound = null;
    let lastScanned = __dirname;
    __dirname.split('/').slice(1).reverse().forEach(dir => {
      const parentPath = path.resolve(lastScanned, '../');
      if (fs.existsSync(path.join(parentPath, filename))) {
        lastFound = path.join(parentPath, filename);
      }
      lastScanned = parentPath;
    });
    resolve(lastFound);
  });
}

async function main() {
  const configPath = getRootFile('.myapprc')
}

这只是一个概念验证,因此并不完美,但可以证明我正在努力实现的目标。