如何为 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')
}
这只是一个概念验证,因此并不完美,但可以证明我正在努力实现的目标。
我正在用 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')
}
这只是一个概念验证,因此并不完美,但可以证明我正在努力实现的目标。