<p>自定义脚本需显式触发,命名大小写敏感且不能有空格;含冒号或与原生命令冲突时须用 composer run-script;PHP 回调需手动引入 autoload.php;参数须用 -- 分隔并优先读取 COMPOSER_ARGS 环境变量。</p>

自定义脚本不会自动运行,必须显式触发;写进 composer.json 的 scripts 字段只是声明,不是注册命令。
脚本名怎么写、怎么调用才有效
你定义的键名就是命令名,大小写敏感、不能有空格,且必须和 composer run 后面跟的完全一致。例如:
"dev:setup": "php scripts/setup.php" 对应调用方式是 composer run "dev:setup"(Windows 必须加双引号);"build" 则可直接用 composer build。
- 脚本名含冒号(如
ci:lint)时,composer ci:lint会报错,必须用composer run-script "ci:lint" - 脚本名恰好和 Composer 原生命令冲突(如
install),composer install永远执行原生命令,你的脚本只能靠composer run-script install - 拼错名、缩进错位(比如把
scripts写在require里面)、漏掉s(写成script)都会导致静默忽略
PHP 回调为什么总报 Class not found
Composer 执行 MyClass::method 时,不自动加载项目 autoloader,类找不到不是配置漏了,而是执行环境没引入。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 类必须已声明在
autoload或autoload-dev中,且已运行过composer dump-autoload - 方法必须是
public static,参数签名要兼容(可选接收$event) - 最稳妥做法:在 PHP 脚本第一行显式写
require __DIR__ . '/../vendor/autoload.php'; - 别依赖
__autoload或手动include单个文件——容易漏依赖,也绕不开 Composer 的自动加载机制
参数怎么传给脚本才真正生效
参数不会自动透传。composer test --filter=MyTest 中的 --filter=MyTest 是被 Composer 自己解析的,根本不会交给脚本进程。
- 必须用双横线
--显式分隔:composer test -- --filter=MyTest,这样phpunit才能收到--filter - PHP 脚本内获取参数,别依赖
$argv(索引可能偏移),优先读getenv('COMPOSER_ARGS')(Composer 4.0+ 支持) - 脚本值里含空格或特殊字符(如
php script.php --env=prod),必须用单引号包裹:"test": "php 'tests/run.php' --group=unit" - Windows CMD 下双引号若不转义或用了全角,
composer run-script "test -- --filter="会解析失败;PowerShell 更稳妥
什么时候该用 shell 命令,什么时候该写 PHP 脚本
直接写 shell 命令看似简单,但跨平台兼容性差、错误难捕获、参数解析弱;真正稳定的逻辑建议封装成 PHP 文件。
- shell 命令适合简单、无依赖、纯系统操作(如
rm -rf build/),但;分隔在 Windows 上可能失败 - PHP 脚本可直接
require项目依赖,用try/catch捕获异常,返回非零退出码让 Composer 中断后续流程 - PHP 脚本能安全处理参数:
composer build -- --env=prod透传后,$argv可正确解析(注意索引偏移) - 避免在脚本中硬编码全局二进制(如
phpunit),改用vendor/bin/phpunit或先which phpunit判断是否存在
最易被忽略的是 autoload 加载时机和参数透传规则——这两个点出错,脚本往往静默失败或报错信息毫无指向性。

















