Composer install后自动执行脚本依靠scripts配置+post-install-cmd事件钩子机制,该钩子在依赖下载、解压及autoload生成完成后触发,需写在根composer.json顶层scripts字段中,加--no-scripts会跳过,失败则中断安装流程。

Composer install 后自动执行脚本靠什么机制
靠 scripts 配置 + 事件钩子,不是插件也不是额外工具。Composer 原生支持在生命周期关键节点触发自定义命令,post-install-cmd 就是安装完成后的标准钩子。
它会在 composer install(含首次安装和更新依赖后重装)成功执行完所有包下载、解压、autoload 生成之后运行,时机可靠,且默认启用,无需额外开关。
- 只对当前项目生效,写在根目录
composer.json的scripts字段里 - 不区分是否带
--no-scripts:加了这个参数,钩子直接被跳过,不会执行 - 如果命令失败(退出码非 0),整个
composer install流程会报错退出,这点常被忽略
怎么配置 post-install-cmd 才能稳定运行 PHP 脚本
最稳妥的方式是调用一个可执行的 PHP 文件入口,而不是内联 php -r 或直接写类方法——前者难调试,后者依赖 autoload 尚未完全就绪(虽然通常可用,但有概率出 Class not found)。
推荐结构:scripts/post-install.php 作为统一入口,用绝对路径加载,避开 autoloader 状态不确定性。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
{
"scripts": {
"post-install-cmd": [
"php scripts/post-install.php"
]
}
}
-
scripts/post-install.php开头需加#!/usr/bin/env php并设可执行权限(Linux/macOS),或确保用php显式调用 - 该文件内不要依赖
vendor/autoload.php以外的第三方类——因为此时 autoload 已生成,但某些插件类可能尚未注册到 PSR-4 - 如需调用 Laravel 的 Artisan 命令,改用
php artisan optimize:clear这类 shell 方式更稳,别尝试Artisan::call()
常见失败现象和对应排查点
执行没反应、报错中断、或提示 Script ... handling the post-install-cmd event returned with error code 1 是高频问题。
- 脚本文件没有执行权限(Linux/macOS):运行
chmod +x scripts/post-install.php - PHP 版本不一致:Composer CLI 用的 PHP 和脚本里
php命令指向不同版本,用which php和composer config --list | grep bin-dir核对 - 相对路径失效:脚本里用
__DIR__安全,别用getcwd()—— Composer 可能在子目录执行 install - 输出被缓冲导致看不到错误:在脚本开头加
ini_set('display_errors', 1); error_reporting(E_ALL);
post-install-cmd 和 post-autoload-dump 有什么区别
两者触发时机不同,不能混用。post-install-cmd 在整个安装流程末尾运行;而 post-autoload-dump 仅在 vendor/autoload.php 重新生成后触发,比如运行 composer dump-autoload 或 install/update 中 autoload 更新阶段。
- 要清理缓存、生成配置、检查环境变量?用
post-install-cmd - 要重新扫描注解、刷新 Doctrine 代理类、或依赖完整 autoloader 的代码生成?用
post-autoload-dump - 二者可共存,但注意
post-autoload-dump不保证 vendor 包已全部解压完毕,某些vendor/bin/xxx可能还不存在
实际项目中,多数“安装后要做的事”都落在 post-install-cmd,但它不像 Webhook 那样灵活——没有上下文对象传入,只有原始命令行参数,想区分是 install 还是 update,得自己解析 $argv 或查 composer.lock 修改时间。

















