自定义 php 脚本需显式执行 composer run,脚本名大小写敏感、无空格且严格匹配 composer.json 中顶层 scripts 键;需手动引入 autoload.php;参数须用 -- 分隔;post-install-cmd 仅在 vendor 为空且 lock 文件不一致时触发。

自定义 PHP 脚本命令不会自动运行,必须显式调用 composer run;脚本名大小写敏感、不能含空格,且必须严格匹配 composer.json 中 scripts 键下的键名。
脚本声明必须放在 composer.json 顶层 scripts 字段里
Composer 只认顶层的 scripts(注意是复数),写在 extra、config 或缩进错位都会被静默忽略。键名就是你之后要敲的命令名,比如:
{
"scripts": {
"dev:setup": "php scripts/setup.php",
"build": ["rm -rf build/", "mkdir build", "cp -r src/ build/"]
}
}
- 键名含冒号(如
dev:setup)时,Windows 下必须加双引号:composer run "dev:setup";macOS/Linux 可省略但建议统一加 - 键名若与 Composer 原生命令冲突(如
install、update),composer install永远执行原生命令,你的脚本只能靠composer run-script install - 拼错成
dev-setup或漏掉s(写成script)——不报错,也不执行
PHP 脚本里 new 类报 Class not found 怎么办
Composer 执行脚本时不自动引入 vendor/autoload.php,这不是配置问题,而是执行时机隔离导致的。类找不到,90% 是因为没手动 require。
- 脚本放在
scripts/目录下,第一行必须写:require __DIR__ . '/../vendor/autoload.php';(注意是../vendor,不是/vendor) - 类必须已声明在
autoload或autoload-dev中,且已运行过composer dump-autoload - 回调方法(如
MyClass::run)必须是public static,且不能直接 new 未通过 autoload 注册的第三方类(如new Illuminate\Support\Str)
参数怎么传进去,脚本才能真正收到
Composer 不解析参数,只负责透传;漏掉 -- 分隔符,参数就被它自己吃掉了。
- 正确写法:
composer run "dev:setup" -- --env=prod --force→ PHP 脚本里可通过getenv('COMPOSER_ARGS')拿到--env=prod --force - 错误写法:
composer run "dev:setup" --env=prod→ Composer 尝试解析--env,报错或静默丢弃 - 别依赖
$_SERVER['argv']:索引偏移不可靠(Composer 会插入自己的参数),COMPOSER_ARGS是 Composer 4.0+ 提供的稳定入口 - 脚本值里有空格或特殊字符(如
php script.php --env=prod),必须用单引号包裹:"dev:setup": "php 'scripts/setup.php' --env=prod"
post-install-cmd 不执行?大概率是你没满足触发条件
它不是“每次 composer install 都跑”,而是仅当三个条件同时成立时才触发:vendor 目录不存在或为空、composer.lock 缺失或与 composer.json 不一致、且没加 --no-scripts。
- 本地反复运行
composer install却没反应?说明vendor/已存在,Composer 直接跳过初始化流程,脚本根本不会跑 - 想让逻辑在每次
composer update或composer require后都执行,应该用post-update-cmd,而不是post-install-cmd - 和自动加载相关的操作(如生成 classmap、清理旧 autoload 文件),优先用
post-autoload-dump,它更精准、更可靠,且不依赖 vendor 是否为空
最常被忽略的是路径和执行时机:脚本路径是相对于项目根目录的,而 __DIR__ 在 PHP 脚本里指向的是脚本自身所在目录;post-install-cmd 的触发逻辑不是“安装完就跑”,而是“从零开始装才跑”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











