Composer scripts 不自动执行,仅在 composer install/update 或 composer run-script 时触发;PHP 脚本需手动引入 autoload.php;传参须用 -- 分隔;钩子失败行为依 pre/post 类型而异。

scripts 里写的命令为什么没执行
Composer 的 scripts 不是写完就自动跑的,它只在特定时机触发:比如执行 composer install、composer update,或你手动运行 composer run-script xxx(或更推荐的简写 composer xxx)。常见错误是改完 composer.json 后直接双击脚本文件,或者敲 php scripts/deploy.php —— 那只是普通 PHP 文件,和 Composer 完全无关。
- 确认触发方式:用
composer run xxx或composer run-script xxx,不是php composer.phar xxx - 脚本名大小写敏感,且不能被
scripts-descriptions覆盖(该字段仅用于composer list显示说明) - Windows 用户注意:命令行中含破折号(如
ci:lint)时,必须加双引号:composer run-script "ci:lint",否则解析失败 - 钩子类脚本(如
post-install-cmd)不会在composer dump-autoload等命令中触发,别误以为“只要装了依赖就一定跑”
PHP 脚本里 new 类报 Class not found 怎么办
Composer 执行脚本时,默认不加载项目 autoloader,所以直接 new App\Services\Deployer() 必然失败。这不是 bug,而是设计——避免脚本污染主流程的加载上下文。
- 最稳妥做法:在 PHP 脚本第一行显式引入:
require __DIR__ . '/vendor/autoload.php'; - 别用
include 'vendor/autoload.php'(路径可能错)、也别依赖__autoload(已废弃) - 如果脚本在
scripts/目录下,__DIR__指向的是scripts/,不是项目根目录,所以要用__DIR__ . '/../vendor/autoload.php' - 开发阶段可加一句判断:
if (!class_exists('Composer\Autoload\ClassLoader')) { die('autoload not loaded'); },快速定位问题
怎么安全地传参给自定义脚本
Composer 不解析参数,只负责透传。漏掉 -- 分隔符,参数就会被 Composer 当作自己的选项吞掉,脚本完全收不到。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 正确写法:
composer test:unit -- --filter=testLogin,--后的内容才进$argv - PHP 脚本中建议用
$_SERVER['COMPOSER_ARGS'](Composer 4.0+ 提供),比$argv更可靠,避免索引偏移 - Shell 命令中慎用
$1、$2:Windows CMD 不支持,跨平台应改用bash -c 'php script.php "$@"' -- $@或封装成独立 PHP 入口 - 环境变量不要靠
$_ENV:CLI 下默认为空,统一用getenv('APP_ENV') ?: 'dev'或$_SERVER['APP_ENV'] ?? 'dev'
钩子脚本失败后后续命令还执行吗
钩子失败行为取决于类型和阶段:pre-* 失败会中断主命令(比如 composer install 直接退出),post-* 失败默认只警告,但整个流程继续——除非你加了 --no-dev 或设置了 COMPOSER_NO_INTERACTION=1 等影响判断逻辑的环境变量。
-
pre-install-cmd返回非零退出码 →composer install中止,不装包 -
post-install-cmd中某条失败 → 剩余同钩子里的命令跳过,但安装本身已完成 - 多个脚本共用一个钩子时(数组形式),任一失败即停止后续执行,不会“尽力而为”
- 调试时加
-v参数,关键线索是日志里的Script ... returned with error code ...
真正容易被忽略的,是工作目录和 PATH 的隐式变更:所有脚本都在项目根目录执行,且 vendor/bin/ 已被前置到 PATH;但如果你在脚本里调 exec('git status'),得确认 Git 是否在 CI 环境 PATH 中——Composer 不会帮你补全系统级命令路径。










