composer脚本不是自动执行的开关,仅在composer install/update或显式运行composer run-script时触发;不自动加载autoloader,php类需手动require vendor/autoload.php;参数传递必须用--分隔。

Composer scripts 不是“写完就自动跑”的自动化开关,它只在 composer install、composer update 或显式执行 composer run-script xxx(或简写 composer xxx)时触发;脚本内不自动加载项目 autoloader,PHP 类必须手动 require;传参必须用 -- 显式分隔,否则参数会被 Composer 吞掉。
scripts 字段怎么写才被识别
它必须是 composer.json 的顶层字段,不能嵌套在 require、autoload 或其他键下面。拼错名、缩进错位、少引号都会导致命令“不存在”——composer list 里压根不显示。
- 键名就是命令名:
"dev:serve"对应运行composer dev:serve,大小写、冒号、破折号全部敏感 - 值支持字符串(单条命令)或数组(多条顺序执行),推荐数组:
"build": ["rm -rf build/", "mkdir build", "cp -r src/ build/"] - Windows 用户注意:
composer run-script ci:lint会失败,必须加双引号:composer run-script "ci:lint" - 别把脚本逻辑塞进
extra或config字段——Composer 只认scripts这一个入口
PHP 脚本里 new 类报 Class not found 怎么办
Composer 执行 scripts 时默认不加载 vendor/autoload.php,这是设计行为,不是 bug。所有类加载都得你自己负责。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 第一行必须写:
require __DIR__ . '/../vendor/autoload.php';(假设脚本在scripts/目录下) - 别用
include 'vendor/autoload.php'——路径可能错;也别依赖__autoload(已废弃) - 如果脚本放在项目根目录,用
require __DIR__ . '/vendor/autoload.php'; - 加个防护判断更稳妥:
if (!class_exists('Composer\Autoload\ClassLoader')) { die('autoload not loaded'); }
参数怎么传进去又怎么拿到
Composer 不解析参数,只透传。漏掉 --,参数就消失在半路,脚本完全收不到。
- 运行命令必须带
--:composer test:unit -- --filter=testLogin,否则phpunit收不到--filter - Shell 命令中用
$@接收全部参数,但 Windows CMD 不支持;统一做法是封装成 PHP 脚本,读$_SERVER['argv']或getenv('COMPOSER_ARGS') - 别依赖
$1、$2——它们在 Windows 下无效,且容易被 shell 层吃掉 - 环境变量要显式传递:
"dev:start": "APP_ENV=dev php -S localhost:8000"在 Linux/macOS 有效,Windows 需改用cmd /c "set APP_ENV=dev && php -S ..."或交由 PHP 脚本用getenv()读取
post-install-cmd 和 post-update-cmd 到底什么时候跑
这两个钩子只在 composer install 或 composer update 成功完成包安装后触发,不是“每次部署都跑”,而是“每次依赖变更才跑”。误放迁移命令在这里,CI 构建或本地 update 就可能意外改库。
-
composer require xxx是update流程,只触发post-update-cmd,不触发post-install-cmd - 真正适合放钩子里的,是开发环境初始化类操作,比如
"post-install-cmd": ["@php scripts/init-dev-env.php"],且该脚本应检查getenv('COMPOSER_DEV')防止污染生产 - 与自动加载相关的操作(如生成 classmap),优先用
post-autoload-dump,它更精准、更可靠 - 别指望
post-install-cmd在composer dump-autoload时触发——它不会
最常被忽略的是:脚本退出码。如果 PHP 脚本里 exit(1) 或抛出未捕获异常,composer run-script 会中断并报错,这在 CI 流水线里可能直接卡住部署;但反过来,如果脚本静默失败却返回 0,后续步骤照常执行,问题反而更难定位。










