composer脚本需显式调用或配置钩子才能执行,定义在composer.json的scripts字段中,支持shell命令、php函数调用(如appscriptshealthcheck::run)和外部php脚本路径(如php scripts/backup-db.php),推荐用php脚本以保障autoloader加载、环境变量注入及跨平台稳定性。

Composer 脚本不是“写完就能跑”的魔法,它默认只在 composer install 或 composer update 时触发;想让它干部署或维护的活,必须显式调用或手动配置钩子。
如何定义可独立运行的 Composer 脚本
脚本本质是命令别名,写在 composer.json 的 "scripts" 字段里,支持 shell 命令、PHP 函数调用、甚至完整脚本路径。
- 直接写 shell 命令:
"deploy:clear-cache": "php artisan cache:clear && php artisan config:clear" - 调用 PHP 函数(需确保函数已加载):
"health:check": "App\Scripts\HealthCheck::run",注意命名空间和自动加载要到位 - 指向外部脚本文件:
"backup:db": "php scripts/backup-db.php",路径相对于项目根目录 - 多个命令用
&&连接,但失败会中断;如需容错,改用;或封装进 shell 脚本
为什么 composer run-script 比直接写 shell 更可靠
直接执行 php scripts/deploy.php 看似简单,但会绕过 Composer 的 autoloader、环境变量注入(如 COMPOSER_DEV)、以及当前 composer.json 所声明的依赖上下文。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer run-script deploy:build自动加载vendor/autoload.php,所有require-dev包都可用 - 脚本内可通过
getenv('COMPOSER_DEV')判断是否在 dev 模式下运行 - 若脚本返回非零退出码(例如 PHP 中
exit(1)),composer run-script会报错并停止后续操作,适合做校验环节 - 避免手误执行错环境:比如本地误跑生产清理命令,可在脚本开头加
if (getenv('APP_ENV') !== 'prod') { exit(1); }
post-install-cmd 和 post-update-cmd 的真实执行时机
这两个钩子只在 composer install 或 composer update 成功完成包安装后触发,不适用于日常维护任务——它们不是“每次部署都跑”,而是“每次依赖变更才跑”。
- 常见误用:把
php artisan migrate放进post-update-cmd→ 导致 CI 构建时意外执行迁移,或本地composer update触发线上 DB 变更 - 正确做法:迁移应由部署流程显式控制,例如
"deploy:migrate": "php artisan migrate --force",再由运维或 CI 步骤决定是否执行 - 真正适合放钩子里的,是开发环境初始化类操作:
"post-install-cmd": ["@php scripts/init-dev-env.php"],且该脚本应检查getenv('COMPOSER_DEV')防止污染生产 - 钩子中不要依赖未声明为
require-dev的工具(如php-cs-fixer),否则composer install --no-dev时会报错
调试 Composer 脚本时最常卡住的三个点
脚本静默失败、路径错误、权限混淆是高频问题,比逻辑错误更难定位。
- 脚本输出被 Composer 缓存吞掉:加
-v参数查看详细日志,composer run-script deploy:build -v - 相对路径以 Composer 执行位置为准,不是
composer.json所在目录:若在子目录执行composer run-script,scripts/xxx.php会从子目录找,建议统一用__DIR__ . '/scripts/xxx.php'在 PHP 脚本中处理 - CI 环境中用户权限不同:脚本里写的
chmod -R 755 storage/在 Docker 容器内可能因 UID 不匹配失效,改用chown -R www-data:www-data storage/并确保用户存在 - PHP CLI 版本与 Web 不一致:脚本里调用
php artisan时,CLI 的php.ini可能禁用扩展(如pdo_mysql),用php -m | grep pdo验证
真正麻烦的从来不是写脚本,而是让脚本在不同环境里稳定输出相同行为——路径、权限、PHP 配置、环境变量,每个环节都得亲手验证,不能只信本地跑通了。










