Composer脚本是命令别名与钩子注册表,仅在显式触发时执行;post-install-cmd和post-update-cmd仅在composer install/update成功后运行,不自动响应git pull或CI/CD;自定义脚本须用composer run调用;复杂逻辑应封装为PHP脚本并手动加载autoloader。

Composer 脚本不是“自动干活的机器人”,它本质是命令别名 + 生命周期钩子的注册表,只在你明确触发时才执行,且默认不加载项目 autoloader、不注入环境变量、不保证跨平台兼容性。
post-install-cmd 和 post-update-cmd 什么时候会跑
这两个钩子只在 composer install 或 composer update 成功完成依赖安装/更新后触发,不会在 git pull 后自动运行,也不会在 CI/CD 流水线里“自己醒过来”。
- 它们只对当前命令负责:如果加了
--no-scripts(生产部署常用),那它们直接跳过,一句都不会执行 -
post-install-cmd在首次拉代码并install时有用;post-update-cmd更适合本地开发同步状态,而非线上部署 - 别把数据库迁移、权限修复这类关键操作全塞进这两个钩子里——一旦某次
composer update没走,线上缓存就 stale 了
自定义脚本名(如 deploy:clear-cache)怎么调用才生效
自定义名字不会自动触发,必须显式运行 composer run deploy:clear-cache(推荐)或 composer run-script deploy:clear-cache(旧写法,不支持参数透传)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 脚本值可以是字符串(
"php artisan cache:clear")、字符串数组(顺序执行多条)、或关联数组(带script和description) - 想传参?用
composer run lint -- src/MyClass.php,双横线--后的内容会原样透传给底层命令 - 别在 scripts 字段里写
if [ "$APP_ENV" = "prod" ]; then ...—— shell 片段在 Windows 上直接失效,应封装为 PHP 脚本再调用
为什么直接写 shell 命令容易翻车
scripts 字段里塞 "chmod -R 755 storage/" 看似简单,实则埋了三个雷:路径、权限、PHP 版本。
- 当前工作目录虽是项目根目录,但
php命令可能调用系统默认版本(比如 Ubuntu 的 php8.1),而你的artisan需要 php8.3 - 权限命令没指定用户上下文,
chmod可能成功,但后续 Web 进程仍因 UID 不匹配无法写入storage/logs - 相对路径不可靠,建议统一用
${PWD}/storage显式锚定,或改用 PHP 脚本内调用chmod()函数 - 复杂逻辑(如判断 git 分支、读取 .env、条件执行 migrate)请立刻抽离到
scripts/deploy-check.php,再从 scripts 中调用"php scripts/deploy-check.php"
PHP 类方法调用(如 App\Scripts\HealthCheck::run)为什么常报错
报 Class not found 或 Call to undefined method 不是因为写错了命名空间,而是 autoloader 没加载、脚本没执行在正确上下文里。
- 类必须已声明在
composer.json的autoload或autoload-dev中,且已运行过composer dump-autoload - 方法必须是
public static,且签名接受一个Event对象参数(如来自Composer\Script\Event) - 最稳妥做法:在 PHP 脚本开头手动
require_once __DIR__.'/../vendor/autoload.php',再实例化调用,绕过 Composer 对静态方法调用的隐式限制 - 别依赖
$_ENV读环境变量——CLI 下为空,改用getenv('APP_ENV')或$_SERVER['APP_ENV']
真正容易被忽略的是:所有 scripts 命令都以项目根目录为 cwd,但不会自动切换用户、不会重载 .env、也不会校验当前 PHP 是否满足 composer.json 中 config.platform.php 的要求。这些事得你亲手补上,而不是指望 Composer “懂你”。

















