post-install-cmd和post-update-cmd是composer安装后执行自定义脚本的唯一可靠入口点,必须声明在composer.json的"scripts"字段下;前者仅在首次安装或lock变更时触发,后者覆盖update及require场景,二者可共用同一类方法实现统一行为。

Composer install 时执行自定义脚本的正确入口点
Composer 的 post-install-cmd 和 post-update-cmd 是唯一可靠触发时机,不是 pre-install-cmd 或自定义脚本名。钩子必须声明在 composer.json 的 "scripts" 字段下,且需明确指定事件类型:
- 若只希望安装依赖后提醒,用
"post-install-cmd": ["MyScript::speak"] - 若同时覆盖更新场景,可合并为
"post-install-cmd": ["MyScript::speak"], "post-update-cmd": ["MyScript::speak"] - 脚本类必须是自动加载可达的(如放在
src/下并已配置 autoload)
PHP 中调用系统 TTS 命令的兼容写法
直接在 PHP 里用 exec() 调中文语音合成,关键不是选哪个引擎,而是绕过编码和权限陷阱。macOS 自带 say 支持中文,Windows 需依赖 powershell -Command [Speech.Synthesis.SpeechSynthesizer]::new().Speak(...),Linux 则基本不可靠——建议统一降级为 macOS/Windows 双路径判断:
public static function speak()
{
$msg = '依赖安装完成';
if (PHP_OS_FAMILY === 'Darwin') {
exec('say -v Ting-Ting ' . escapeshellarg($msg));
} elseif (PHP_OS_FAMILY === 'Windows') {
$encoded = base64_encode($msg);
exec('powershell -Command "$s = New-Object -ComObject SAPI.SpVoice; $s.Speak([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String(\'' . $encoded . '\')))" 2>NUL');
}
}
注意:escapeshellarg() 必须用,中文引号或顿号会直接导致命令失败;2>NUL 是 Windows 下静默错误输出的必要操作,否则 Composer 会卡住。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
监控 install 是否真正完成而非仅钩子触发
Composer 钩子在 install 主流程结束后才运行,但“完成”不等于“无报错”。你真正需要的是:任务成功 + 无 warning/failure 输出。最轻量做法是检查退出状态和日志缓冲:
- 不要依赖钩子是否执行——它总能跑,哪怕
composer install因网络失败而中断 - 把实际安装命令包装一层:
composer install --no-interaction 2>&1 | tee /tmp/composer.log - 在钩子中先读
/tmp/composer.log,grep"Installing dependencies"和"Generating autoload files"是否都出现,再决定是否播放语音 - 更稳的做法是加临时标记文件:
touch /tmp/composer_install_success在钩子开头写入,结尾校验是否存在且未被删
中文语音合成失败的三个高频原因
不是语音引擎没装好,而是环境链路断在更前端:
-
say -v Ting-Ting在 macOS 上失效?大概率是当前执行用户(如 www-data 或 CI runner)没有 GUI 权限,改用afplay播放预录的 mp3 更可靠 - Windows 下 PowerShell 报
Retrieving the COM class factory...?说明 SAPI 未注册,需以管理员身份运行一次regsvr32 sapi.dll - 中文乱码?PHP 进程默认编码不是 UTF-8,
mb_internal_encoding('UTF-8')必须在脚本开头显式设置,且不能依赖php.ini中的配置(Composer 启动时不加载全部 ini)
真要稳定提醒,语音只是锦上添花;优先确保日志落盘、退出码捕获、临时文件标记这三件事闭环。合成语音本身,永远是最容易被砍掉的一环。










