You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:04:57