如何在运行时为第三方Node.js CLI脚本设置prompts.override()?
给无法修改源码的prompts CLI脚本设置自动回答
下面是几个不用改目标脚本源码就能设置prompts.override()的可行方案:
方案1:用Node.js实验性加载器劫持prompts模块
通过自定义加载器,在目标脚本加载prompts模块之前,提前设置好预设答案。
- 新建一个加载器脚本,比如命名为
prompts-override-loader.js,代码如下:
import { readFile } from 'fs/promises'; import { resolve as resolvePath } from 'path'; export async function load(url, context, nextLoad) { // 拦截prompts模块的加载请求 if (url.includes('prompts/lib/index.js') || url.includes('prompts/index.js')) { // 先获取原始的prompts模块 const originalModule = await nextLoad(url, context); // 包装模块代码,添加override逻辑 const modifiedCode = ` const prompts = require(${JSON.stringify(url)}); // 这里替换成你要预设的答案,key对应prompts配置里的name字段 prompts.override({ username: 'test_user', password: 'test_pass' }); module.exports = prompts; `; return { format: 'commonjs', source: modifiedCode, shortCircuit: true }; } // 其他模块正常加载 return nextLoad(url, context); }
- 用这个加载器启动目标脚本:
node --experimental-loader ./prompts-override-loader.js 你的目标CLI脚本路径.js
注意:这个功能是Node.js的实验性特性,建议用Node.js 16及以上版本测试。
方案2:用require.extensions兼容旧版Node.js
如果你的Node.js版本不支持实验性加载器,可以用传统的模块缓存劫持方法:
- 新建注入脚本
inject-prompts-override.js:
// 找到prompts模块的路径并加载 const modulePath = require.resolve('prompts'); const originalPrompts = require(modulePath); // 设置预设答案 originalPrompts.override({ username: 'test_user', password: 'test_pass' }); // 替换模块缓存,让后续引用的都是已经设置好override的prompts require.cache[modulePath].exports = originalPrompts; // 加载目标CLI脚本 require('./你的目标CLI脚本路径.js');
- 运行这个注入脚本:
node inject-prompts-override.js
方案3:环境变量传参(看脚本是否支持)
如果目标脚本本身支持从环境变量读取回答,直接设置环境变量运行就行,但这个不是通用方案,得看目标脚本的实现:
USERNAME=test_user PASSWORD=test_pass node 你的目标CLI脚本路径.js
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

