Composer 自定义安装器无法实现中文交互,因其 install/update 在非 TTY 环境静默执行,STDIN 不可用;正确做法是通过 post-install-cmd 脚本配合 $io->ask() 实现交互,并解耦 Installer 与配置逻辑。

Composer 自定义安装器里加不了真正意义上的“中文交互逻辑”,因为它的 install/update 流程完全不走标准输入(STDIN),也不支持 read、prompt 这类终端交互——所有脚本都在非 TTY 环境下静默执行,强行写交互会直接卡死或报 PHP Warning: fgets(): Read failed。
为什么 install() 方法里不能用 echo + readline
自定义 Installer 的 install() 和 update() 是在 Composer 内部调用的,运行上下文没有伪终端(pty),posix_isatty(STDIN) 返回 false,任何依赖用户键入的操作都会失败。
- 你写
echo "请输入路径:"; $path = trim(fgets(STDIN));→ 直接阻塞,CI 环境直接超时 -
$io->ask()在 Installer 里不可用,它只对 Plugin 的activate()或 scripts 生效 - 即使本地终端能跑通,一旦进到 Docker 或 GitLab CI,立刻崩
想引导用户配置?只能靠 post-install-cmd 脚本
真正的交互入口不是 Installer,而是 composer.json 里的 scripts。Installer 负责放文件,脚本负责问问题。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 在你的包里声明:
"scripts": { "post-install-cmd": "My\Package\Configurator::run" } - 在
Configurator::run()里先检查if (!posix_isatty(STDIN)) { return; },避免 CI 崩溃 - 用
$input = $io->ask('请指定配置目录(默认 config/):', 'config/');—— 这个$io是 Composer 提供的合法交互对象 - 把用户输的值写进
config/my-package.php或生成.env.local片段
中文提示别硬翻,优先保变量和路径可读
别在脚本里写 "请输入数据库主机地址",而要用英文提示 + 中文注释说明,比如:
Database host (e.g. localhost) [中文示例:localhost 或 127.0.0.1]
- 避免翻译
vendor/autoload.php成“供应商自动加载文件”——这会让用户找不到真实路径 - 错误码如
InvalidArgument必须保留原名,它是调试关键线索 - 如果真要中文输出,用环境变量开关:
if (getenv('MY_PKG_LANG') === 'zh') { ... },但默认关掉
最常被忽略的一点:Installer 和交互脚本必须解耦
很多人把配置逻辑塞进 install(),结果一升级 Composer 就失效——因为从 v2.5 开始,Installer 的执行时机更早,且明确禁止 I/O 操作。真正的配置引导必须独立成 script,由 Composer 主流程在 install 完成后显式触发。否则,你写的每一行中文提示,都只是给开发机看的幻觉。

















