composer scripts字段仅用于定义命令别名和生命周期触发点,须严格使用字符串或数组格式,禁止逻辑判断与硬编码路径,且事件名大小写及连字符必须精确匹配。

Composer 的 scripts 字段不是写“钩子教程”的地方,而是定义命令别名 + 生命周期触发点的配置区——写错位置、混淆执行时机、硬编码路径,是 80% 项目出问题的根源。
scripts 里写什么?只放可执行的命令或函数调用
它不接受逻辑判断、变量赋值、多行脚本;只接受字符串(shell 命令)或数组(含 php 调用)。Composer 会按顺序执行,但不会解析语法错误。
- ✅ 正确:
"post-install-cmd": "php artisan optimize:clear" - ✅ 正确:
"pre-autoload-dump": ["MyScript::beforeAutoload"] - ❌ 错误:
"post-update-cmd": "if [ -f .env ]; then php artisan key:generate; fi"(Shell 条件在 Windows 下直接失败) - ❌ 错误:
"test": "export APP_ENV=test && vendor/bin/phpunit"(export在某些 Composer 版本中不生效)
常见生命周期事件名不能拼错,大小写和连字符必须严格匹配
Composer 不报错提示拼写错误,而是静默跳过——你写的 post-autoloader-dump 永远不会触发,因为正确名称是 post-autoload-dump。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 关键事件:
pre-install-cmd、post-install-cmd、pre-update-cmd、post-update-cmd、pre-autoload-dump、post-autoload-dump - 注意:
post-autoload-dump是生成自动加载文件后触发,不是post-dump-autoload(后者不存在) - 自定义脚本名可以任意,但调用时必须和
scripts中定义的 key 完全一致:composer run-script my-build→ 配置中必须有"my-build": "..."
PHP 类方法调用必须满足 autoload 可达,且方法需为 public static
Composer 在执行类方法前不会重新 dump autoload,所以你的类必须已能被当前 autoloader 加载(比如在 vendor/autoload.php 已覆盖,或通过 files 预加载)。
- 类路径未注册 → 报错:
Class "MyScript" not found - 方法不是
public static→ 报错:Non-static method MyScript::run() cannot be called statically - 推荐写法:
"pre-autoload-dump": ["MyBuild\Scripts::checkConfig"],并在composer.json的autoload中确保MyBuild\Scripts映射到对应文件
Windows 下 shell 命令兼容性最常翻车
Linux/macOS 写的 rm -rf、cp、管道符 | 在 Windows 默认 cmd 中根本不能用,而 Composer 不做平台适配。
- 跨平台安全做法:统一用 PHP 脚本封装操作,例如
"clean-cache": "php scripts/clean-cache.php" - 若坚持用 shell,改用
roblocher/composer-shell这类插件,或限定执行环境(CI 中指定shell: bash) - 避免
&&链式调用:某些旧版 Composer 在 Windows 上会截断第二条命令
真正麻烦的从来不是怎么写,而是谁在什么时候、以什么用户权限、在哪个工作目录下执行了它——特别是当 post-autoload-dump 里调用了 file_put_contents(__DIR__.'/storage/app/.lock', 'x'),而部署用户没写权限时,整个 composer install 就会卡住,还看不出错在哪。










