post-install-cmd 仅在 vendor/ 不存在或为空时执行 composer install 触发,不响应 update 或已有依赖场景;需用 post-update-cmd 实现每次更新后运行,脚本须定义在根 composer.json 的 scripts 字段中。
Post-install-cmd 脚本执行时机和触发条件
Composer 的
只在运行
且
不存在或为空时触发。它不会在
或已有依赖已安装的情况下执行——这点常被误认为“脚本没生效”,实际是命令用错了。
如果想每次更新依赖后都执行(比如生成 autoload map 或清理缓存),改用
不会因
以外的参数跳过,但 CI 环境中若用了
,而脚本定义在
包里,也可能导致脚本未加载
脚本注册必须写在根
的
字段下,子包里的定义不生效
在 scripts 中声明 PHP 函数或命令行脚本
支持三种调用方式:内置命令、自定义 PHP 方法、外部 shell 命令。优先用 PHP 方法,避免跨平台兼容问题(如 Windows 下
失败)。
内置命令直接写字符串:
(Laravel 场景)
自定义 PHP 方法需带命名空间和双冒号:
,对应类中需是
方法
Shell 命令建议加
防止非零退出码中断安装流程,例如:
多个脚本用数组形式顺序执行,比用
更清晰、更易调试:
PHP 脚本里如何安全访问 Composer 运行上下文
纯 PHP 脚本(如
)默认收不到 Composer 的 IO 或 Event 对象。若需要读取配置、判断是否是生产环境,得手动传入或从全局状态提取。
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
推荐方式:通过
参数接收上下文,方法签名必须为
从
可拿到
(项目配置)、
(输出控制)、
(区分 --dev/--no-dev)
不要直接
—— Composer 已加载自动加载器,重复 require 可能引发 ClassLoader 冲突
若脚本需修改文件(如生成 env 文件),路径应基于
,而非硬编码
;CI 环境工作目录可能不是项目根
常见失败原因和调试技巧
报错时 Composer 默认只显示 “Script xxx handling the post-install-cmd event returned with error code 1”,不打印具体错误,排查成本高。
加
(verbose)参数重跑:
,能看到完整命令输出和堆栈
在 PHP 脚本开头加
,确保错误不被静默吞掉
避免在脚本里调用
或
—— Composer 期望脚本自然返回,异常应抛出
Windows 用户注意路径分隔符:用
,别写死
Composer 的脚本机制本身轻量,但组合使用时容易混淆
和
的边界——后者在 autoloader 重建时触发,更适合影响类加载逻辑的操作,比如注册 classmap 或生成代理类。
post-install-cmdcomposer installvendor/composer updatepost-update-cmdpost-install-cmd--no-scripts--no-devrequire-devcomposer.json"scripts"scriptsrm -rf"post-install-cmd": "php artisan optimize:clear""post-install-cmd": "App\ComposerScripts::buildAssets"public static|| true"post-install-cmd": "npm ci && npm run build || true"&&"post-install-cmd": ["@php scripts/build.php", "chmod +x bin/deploy"]App\ComposerScripts::buildAssetsComposer\Script\Eventpublic static function buildAssets(Event $event)$event$event->getComposer()$event->getIO()$event->isDevMode()require 'vendor/autoload.php'getcwd()./.envpost-install-cmd-vcomposer install -verror_reporting(E_ALL); ini_set('display_errors', 1);exit()die()RuntimeExceptiondirname(DIR) . DIRECTORY_SEPARATOR . 'public'/publicpost-install-cmdpost-autoload-dump