composer脚本需显式触发,不自动执行;php脚本必须手动require autoload.php,否则class not found;参数传递须用--分隔,scripts须为composer.json顶层字段且语法严格合规。

Composer 脚本不是“写完就跑”,它只在 composer install、composer update 或 composer run-script 显式调用时触发;PHP 脚本默认不加载项目 autoloader,直接 new 类必报错;所有参数必须用 -- 分隔,否则会被 Composer 自己吃掉。
scripts 字段怎么写才不会静默失效
脚本必须是 composer.json 的顶层字段,缩进错一级、多一个逗号、用了全角引号,都会导致整个 scripts 块被忽略——Composer 不校验语法,只静默跳过。
- 键名即命令名,大小写和符号严格匹配:
"dev:serve"就只能用composer dev:serve,composer Dev:serve或composer dev serve都无效 - 值支持字符串(单条 shell 命令)或数组(多条顺序执行),推荐数组:避免 shell 解析差异,比如
"build": ["rm -rf build/", "mkdir build", "cp -r src/ build/"] - Windows 用户注意:
ci:lint这类含冒号的命令,CMD 下必须加双引号:composer run-script "ci:lint",否则解析失败 - 别把
scripts塞进require或autoload里——它只认顶层键
PHP 脚本里 new 类报 Class not found 怎么办
Composer 执行脚本时,默认不引入 vendor/autoload.php,这是设计行为,不是 bug。脚本运行环境与主项目隔离,避免污染。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 第一行必须显式加载:
require __DIR__ . '/../vendor/autoload.php';(假设脚本在scripts/目录下) - 别用
include 'vendor/autoload.php'—— 路径会因执行位置不同而失效 - 更稳妥写法:加判断防止误执行:
if (!class_exists('Composer\Autoload\ClassLoader')) { die('autoload not loaded'); } - 如果用
@php scripts/deploy.php方式调用,@php会自动使用 Composer 绑定的 PHP 版本,但仍需手动 require autoload
怎么安全传参并拿到 -- 后面的内容
Composer 不解析参数,只负责透传。-- 是硬性分隔符,漏掉它,参数就消失在半路。
- 正确调用:
composer test:unit -- --filter=testLogin --group=fast,--后的内容才会进 PHP 脚本 - PHP 脚本中优先读
$_SERVER['COMPOSER_ARGS'](Composer 4.0+ 提供),比$argv更可靠,不受索引偏移影响 - Shell 命令里慎用
$1、$2:Windows CMD 不支持,跨平台应封装成 PHP 入口处理 - 环境变量别依赖
$_ENV(CLI 下为空),统一用getenv('APP_ENV') ?: 'dev'
钩子事件什么时候触发、为什么没跑
常见误解是“只要装了依赖就一定跑”,其实每个钩子有明确触发边界,混用会导致逻辑遗漏或重复执行。
-
post-install-cmd只在composer install时触发,composer update或composer require不会触发它 -
post-update-cmd在composer update和composer require时都触发,但composer install不触发 -
post-autoload-dump在生成新 autoloader 后触发(install/update,或dump-autoload --optimize),适合清理 classmap 缓存、预热代理类 -
post-autoload-dump不在composer dump-autoload单独运行时触发(除非加--optimize),这点极易踩坑
最常被忽略的点:脚本是否幂等。比如生成配置文件的脚本,没加 file_exists() 判断就直接覆盖,CI 构建时可能把线上配置冲掉;又比如清理缓存的脚本,在 post-install-cmd 和 post-update-cmd 里各写一遍,结果同一操作执行两次。写之前先问自己:这个逻辑能不能重复跑?要不要加锁或存在性检查?










