自定义CLI工具allpack无法读取本地配置文件问题求助
问题排查与修复
核心原因
Node.js 中使用 require() 加载相对路径模块时,路径是相对于当前脚本文件的所在目录,而非用户执行命令时的工作目录。你的 CLI 工具如果是全局安装的,./allpack.config.js 会指向 CLI 安装目录下的文件,而非你当前执行命令的项目目录,这就导致工具找不到本地配置文件。
而你手动执行 node -e "require('./allpack.config.js')" 时,是在项目目录下运行 Node,此时相对路径基于当前工作目录,所以能正常读取配置。
修复方案
将配置文件路径解析为基于用户当前工作目录的绝对路径,修改代码中配置路径的处理逻辑:
修改代码片段
// 原代码 const configPath = commander.opts().config || "./allpack.config.js"; const config = require(configPath); // 修改后 const path = require("path"); const resolvedConfigPath = commander.opts().config ? path.resolve(process.cwd(), commander.opts().config) : path.resolve(process.cwd(), "allpack.config.js"); const config = require(resolvedConfigPath);
关键说明
process.cwd():获取用户执行allpack命令时的当前工作目录path.resolve():将相对路径转换为绝对路径,确保require()能定位到正确的配置文件
完整修改后的代码
#!/usr/bin/env node const commander = require("commander"); commander .version("1.0.0", "-v, --version") .usage("[OPTIONS]...") .option("-m, --mode <value>", "Overwriting mode.") .option("-c --config <value>", "Overwriting config file.") .parse(process.argv); const mode = commander.opts().mode; const path = require("path"); // 修复配置路径解析逻辑 const resolvedConfigPath = commander.opts().config ? path.resolve(process.cwd(), commander.opts().config) : path.resolve(process.cwd(), "allpack.config.js"); const webpack = require("webpack"); const fs = require("fs-extra"); const config = require(resolvedConfigPath); const ignoreList = config.ignore || []; const buildBundle = (dir, outputDir, subdirName) => { // Create a webpack configuration for the specific directory const webpackConfig = { mode: mode || config.mode || "development", entry: path.join(dir, "index.js"), output: { path: path.resolve(outputDir), filename: subdirName + ".bundle.js", }, }; return new Promise((resolve, reject) => { webpack(webpackConfig, (err, stats) => { if (err) { reject(err); } else { resolve(stats); } }); }); }; const main = async () => { const pbSrcDir = config.src ? path.join(process.cwd(), config.src) : path.join(process.cwd(), "pbSrc"); if (fs.existsSync(pbSrcDir)) { if (fs.existsSync(config.outputDir)) { fs.removeSync(config.outputDir); fs.mkdirSync(config.outputDir); } else { fs.mkdirSync(config.outputDir); } const subdirs = fs.readdirSync(pbSrcDir); for (const subdir of subdirs) { console.log("Found:", subdir); const subdirPath = path.join(pbSrcDir, subdir); console.log(subdirPath); if ( fs.lstatSync(subdirPath).isDirectory() && !ignoreList.includes(subdir) ) { try { await buildBundle(subdirPath, config.outputDir, subdir); } catch (err) { console.error("======Webpack Error======"); console.error(err); console.error("==========Stats=========="); console.error("Directory:", pbSrcDir); console.error("Output Directory:", config.outputDir); console.error("Config:", JSON.stringify(config)); console.error("========================="); } } } } else { console.error("======Allpack Error======"); console.error("Src directory not found."); console.error("==========Stats=========="); console.error("Directory:", pbSrcDir); console.error("Output Directory:", config.outputDir); console.error("Config:", JSON.stringify(config)); console.error("========================="); } }; main().catch((err) => console.error(err));
内容的提问来源于stack exchange,提问作者Umber Security
相关产品推荐
相关产品推荐

