scripts字段必须位于composer.json根层级,不可嵌套在extra、config等子字段中;键名须严格匹配官方事件名,值支持字符串、数组或PHP静态方法,且仅根目录composer.json中的scripts生效。
scripts 字段必须写在根composer.json 顶层,否则完全不生效。
它不是配置项、不是插件扩展、也不是 extra 或 config 的子字段——放错位置,脚本就等于没写。
scripts 字段必须在根 composer.json 顶层
常见错误是把它塞进
、
或某个包的子配置里。Composer 只扫描项目根目录下
的顶层
键:
✅ 正确:
❌ 错误:
—— 静默忽略
❌ 错误:在 vendor/ 下某依赖包的
里写 scripts —— 根本不读
验证方式很简单:
输出里看不到你的脚本名,基本就是位置错了。用
也能发现格式是否合法,但它不会报“scripts 不在顶层”这种语义错误。
内置事件名拼写必须严格匹配,大小写和连字符都不能错
Composer 不校验钩子名是否有效,拼错就直接跳过,且不提示。比如:
✅(正确)
❌(多一个
,不触发)
❌(驼峰,不识别)
❌(下划线,非标准分隔符)
真正会被自动调用的事件名只有官方文档列出的那十几个,例如:
、
、
。别自己造名字指望它“意会”——
、
这类写法永远不执行。
命令值支持字符串、数组、PHP 类方法,但行为差异很大
同一个钩子名,不同写法执行逻辑完全不同:
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
字符串:
—— 交给 shell 解析,引号、空格、转义全得自己处理,Windows 下容易崩
数组:
—— Composer 直接 exec,绕过 shell,更安全、跨平台兼容性好
PHP 方法:
—— 要求类已能被 autoload 加载(推荐放
里),方法必须是
,且签名可选接收
对象
注意:数组形式里不能写
别名(那是字符串命令里的语法),也不能带
或
—— 数组每项独立执行,失败即中断。
@ 符号只在字符串命令中生效,用于递归调用其他 script
想复用已有脚本,得用
前缀,但它只在字符串值里解析:
✅ 有效:
→ 先展开
成实际命令,再交给 shell 执行
❌ 无效:
→ Composer 会尝试执行名为
的命令,报
❌ 无效:
→ shell 找不到
命令,因为
是你定义的 script 名,不是系统命令
展开是 Composer 内部机制,不经过 shell,所以能跨平台;但嵌套太深(比如
调
再调
)容易出错,建议控制在两层内。
最常被忽略的一点:脚本是否执行,和
是否真的做了事强相关。如果
已存在、
没变,Composer 可能跳过安装流程,也就不会触发
—— 这时候加
看日志,你会发现根本没 “Executing script” 这行输出。
extraconfigcomposer.json"scripts""scripts": { "post-install-cmd": "php artisan optimize:clear" }"extra": { "scripts": { ... } }composer.jsoncomposer run-script --listcomposer validatepost-autoload-dumppost-autoloader-dumprPostAutoloadDumppost_dump_autoloadpre-install-cmdpost-update-cmdpost-root-package-installafter-installonRequire"post-install-cmd": "php artisan key:generate""post-install-cmd": ["php", "artisan", "key:generate"]"post-autoload-dump": "MyBuild\Scripts::clearCache"autoload-devpublic staticComposerScriptEvent@xxx&&||@"test": "@clean && phpunit"@clean"test": ["@clean", "phpunit"]@cleancommand not found"test": "clean && phpunit"cleanclean@@a@b@ccomposer installvendor/composer.lockpost-install-cmd-v