脚本必须定义在composer.json顶层"scripts"对象中,键为脚本名,值为命令;需用composer run(2.2+)或composer run-script调用,不可直接执行;脚本不自动加载autoload,须手动引入vendor/autoload.php。

脚本定义写在 composer.json 的 scripts 字段里
Composer 不是 Shell,它本身不执行任意代码,只调用你声明好的命令。所有可运行的脚本必须显式注册进 composer.json 的 scripts 对象中,否则 composer run 或 composer run-script 根本看不到它。
常见错误是直接在终端里敲 composer run my-script,但 composer.json 里没配 "my-script" —— 这会报错 Script my-script is not defined。
- 脚本名区分大小写,且不能含空格或特殊字符(建议用短横线
my-custom-build) - 值可以是字符串(单条命令)、字符串数组(多条顺序执行),或对象(带
script和description) - 如果命令需要环境变量或当前工作目录敏感操作,记得加
cd ./src &&或用php -d显式指定配置
composer run 和 composer run-script 的区别
composer run 是 Composer 2.2+ 推荐方式,语法更直觉;composer run-script 是旧接口,仍可用但不支持自动补全和描述显示。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
比如你写了:
"scripts": {
"test:unit": "phpunit --testdox tests/Unit",
"build": {
"script": "php build.php",
"description": "Compile assets and generate config"
}
}那么 composer run test:unit 能直接执行,而 composer run-script build 也能跑,但不会打印 description 文字。
-
composer run支持--list查看所有脚本及其描述,composer run-script不支持 -
composer run默认启用输出缓冲和错误捕获,失败时 exit code 更可靠 - CI 环境里建议统一用
composer run,避免因 Composer 版本差异导致脚本不可见
脚本里调用 PHP 类或 Composer 自动加载类要小心
Composer 脚本执行时,vendor/autoload.php 并不自动引入 —— 它只是把命令丢给 shell 执行,跟是否在项目根目录无关。所以 php mytool.php 这种脚本如果用了 new MyService(),却没手动 require autoload,就会报 Class 'MyService' not found。
- 最稳妥做法:脚本开头加
require __DIR__ . '/vendor/autoload.php'; - 如果脚本是 CLI 工具(如
bin/mycmd),确保它已通过autoload-bin注册到 Composer,再在 scripts 中写"cmd": "mycmd" - 避免在 script 字符串里拼接
php -r "require...; new X()"—— 可读性差、引号易错、调试困难
开发阶段调试脚本别跳过 --no-dev 和 --working-dir
本地开发时,你可能想在子模块里运行脚本,或者测试生产环境行为。这时候默认的 composer run xxx 总是在当前目录找 composer.json,且默认加载 dev 依赖 —— 但线上 CI 往往加了 --no-dev,行为不一致就容易漏问题。
- 用
composer run build --no-dev模拟部署环境,确认脚本不依赖phpunit或psysh这类 dev-only 包 - 跨目录执行?加
--working-dir=packages/foo,否则脚本里的相对路径(如../config)会错乱 - 调试输出被吞?加
-v(verbose)或在脚本里用echo/var_dump,注意 Composer 会截断 stderr,某些错误需加2>&1重定向
composer run 会自动切换上下文 —— 这些都不是 Composer 的责任,而是脚本自身环境没理清。

















