composer不支持原生post-install钩子,需用scripts定义notify-webhook命令并由post-install-cmd调用curl发送webhook;注意curl依赖、环境变量传参、错误处理(-fs || true)及唯一标识添加。

Composer install 之后自动触发 Webhook 的核心限制
Composer 本身不提供 post-install 类型的原生钩子(只有 post-install-cmd 和 post-update-cmd),且这些钩子只执行本地命令,不能直接发 HTTP 请求。想在 composer install 成功后发 Webhook,必须借助 shell 命令或轻量脚本中转。
用 scripts 配合 curl 实现最简 Webhook 通知
在 composer.json 的 "scripts" 段落里定义一个自定义命令,再让 post-install-cmd 调用它:
{
"scripts": {
"notify-webhook": [
"curl -X POST -H 'Content-Type: application/json' -d '{\"event\":\"install\",\"status\":\"success\"}' https://your-webhook-endpoint.com"
],
"post-install-cmd": [
"@notify-webhook"
]
}
}
注意几点:
-
curl必须已安装在目标机器上;Windows 用户需确认是否启用 WSL 或安装了 curl - Webhook URL 中的敏感参数(如 token)不应硬编码,建议改用环境变量:
curl -H \"Authorization: Bearer $WEBHOOK_TOKEN\" ... - 如果网络不通或 Webhook 服务不可达,
curl默认会失败并导致composer install报错退出;加-f(fail silently)和-s(silent)可避免阻断主流程:curl -fs -X POST ... || true
为什么不用 PHP 脚本而选 curl
虽然可以写一个 NotifyWebhook.php 并在 scripts 中调用 php NotifyWebhook.php,但实际没必要:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- PHP 脚本要处理 DNS、超时、SSL、错误码等,
curl已经封装好 - Composer 执行 scripts 时的当前工作目录是项目根目录,路径可控;但若依赖
vendor/autoload.php,可能因install还没完成而缺失类文件 - 多数 CI/CD 环境(GitHub Actions、GitLab CI)默认装有
curl,无需额外安装扩展
区分 install 和 update 场景的 Webhook 内容
post-install-cmd 和 post-update-cmd 是两个独立钩子,别混用。如果希望两者都通知,但携带不同上下文,可以这样写:
"scripts": {
"notify-webhook": [
"curl -fs -X POST -H 'Content-Type: application/json' -d '{\"event\":\"$COMPOSER_COMMAND\",\"packages\":$(composer show --format=json | jq -r '.[] | .name + \"@\" + .version' | paste -sd, -)}' https://hook.example.com"
],
"post-install-cmd": ["@notify-webhook"],
"post-update-cmd": ["@notify-webhook"]
}
这里用了 $COMPOSER_COMMAND 环境变量(Composer 2.2+ 支持),值为 install 或 update;jq 提取包名和版本用于调试——但要注意:jq 不是标配,生产环境应避免依赖它,改用更保守的字段(比如只传时间戳和命令类型)。
真正容易被忽略的是:Webhook 请求体里缺乏唯一标识。建议加上 "run_id":"${CI_RUN_ID:-$(date -u +%s)}" 这类字段,方便后续排查某次 install 是否真的触发了通知。










