您好,欢迎访问宜昌市隼壹珍商贸有限公司
400 890 5375Composer scripts 是命令钩子与自定义命令机制,需 composer run-script 显式触发;post-* 钩子仅在对应命令执行且依赖实际安装时调用,vendor 存在且 lock 未变则跳过。
Composer 的 scripts 不是“运行脚本”的快捷方式,而是对命令生命周期的钩子绑定和自定义命令注册机制——直接执行 composer run-script xxx 才算真正触发,而像 post-install-cmd 这类事件钩子,只在对应 Composer 命令(如 composer install)完成时自动调用。
Composer 读取 scripts 是严格按 JSON 格式解析的,常见失效原因不是语法错,而是键名拼写错误或嵌套层级不对:
scripts 必须是根级字段,不能放在 extra 或 config 下post-update-cmd 有效,post-update-CMD 无效script 和 dev 等字段)
{
"scripts": {
"test": "phpunit",
"build": [
"@clear-cache",
"php build.php"
],
"clear-cache": {
"script": "rm -rf var/cache/*",
"dev": true
}
}
}
Composer 默认不透传参数给 scripts 中的命令,必须显式用 -- 分隔:
composer run-script test -- --filter=MyTest → phpunit --filter=MyTest
composer run-script build -- --env=prod → 数组形式脚本不自动接收,需改用封装脚本或 symfony/console 工具处
理参数-- 后的参数这不是 bug,是 Composer 的缓存与执行策略导致的:
vendor/ 已存在且 composer.lock 未变,composer install 会跳过依赖安装,也跳过所有 post-* 钩子--no-cache 强制刷新,或先 composer install --dry-run 看是否真触发了钩子scripts 自定义命令中,用 composer run-script xxx 显式调用Composer 不提供全局上下文对象,但可通过环境变量和约定路径识别运行环境:
COMPOSER_DEV_MODE:值为 1 表示 dev 模式(composer install --no-dev 时为 0)COMPOSER_HOME:指向 Composer 全局配置目录getcwd(),而非假设在 vendor/bin 下运行./vendor/autoload.php —— 推荐用 require __DIR__.'/../vendor/autoload.php';(脚本放 bin/ 下时)真正容易被忽略的是:scripts 中的 PHP 命令默认不继承 vendor/bin 到 $PATH,所以写 "test": "phpunit" 要求 phpunit 已全局安装或通过 bin-dir 配置软链到项目根目录;否则得写成 "test": "vendor/bin/phpunit"。