composer run-script 仅执行 composer.json 中 scripts 下严格定义的脚本,需完全匹配键名、注意引号与分隔符 --,PHP 脚本须手动加载 autoload,复杂逻辑应移至独立脚本。

直接说结论:composer run-script 不是执行任意命令的快捷方式,它只认 composer.json 里 "scripts" 下明确定义的键名——拼错一个字母、多一个空格、大小写不对,都会报 Script not found。
脚本名必须严格匹配,且只能是顶层字段
很多人改完 composer.json 就跑 composer run-script dev:start,结果报错。先检查三件事:
-
"scripts"是composer.json的一级字段,不能缩进在"require"或"autoload"里面 - 键名(比如
"dev:start")必须和命令里写的完全一致:冒号、大小写、中英文标点都不能错 - Windows 命令行下含冒号或破折号的脚本名,必须加双引号:
composer run-script "dev:start"
最可靠验证方式是运行 composer run-script --list,它会列出所有已注册脚本,没出现在这里就等于没生效。
参数必须用 -- 显式分隔,否则被 Composer 吞掉
composer run-script test -- --filter=MyTest 中的中间那个 -- 不是可选的,它是硬性分隔符。漏掉它,--filter=MyTest 就会被 Composer 当作自己的参数处理,最终传给 phpunit 的是空参数。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 错误写法:
composer run-script test --filter=MyTest(Composer 报错或静默忽略) - 正确写法:
composer run-script test -- --filter=MyTest - 如果脚本本身是 shell 命令,注意引号嵌套,比如:
"lint": "php -l \"src/MyClass.php\""
PHP 脚本不自动加载 autoload,必须手动 require
写了个 scripts/deploy.php,里面 new App\Services\Deployer() 直接报 Class not found?不是路径错了,是 Composer 根本没加载 autoloader。
- 在 PHP 脚本第一行加:
require __DIR__ . '/../vendor/autoload.php'; - 别用
include 'vendor/autoload.php'(相对路径不可靠) - 也别依赖
$_ENV或getenv()读环境变量——CLI 下默认为空,得显式putenv('APP_ENV=prod')或用symfony/dotenv - 更稳妥的调用方式是:
"deploy": "@php scripts/deploy.php",@php前缀会自动使用 Composer 绑定的 PHP 版本
别把复杂逻辑塞进 scripts 字段
看到 "build": ["rm -rf build/", "mkdir build", "cp -r src build/"] 这种写法就该警觉——它在 Linux/macOS 下能跑,Windows CMD 下基本全跪;而且没法做条件判断、异常捕获、日志记录。
- 真正要自动化部署、迁移、通知,应该拆成独立 PHP 脚本,比如
scripts/deploy/precheck.php、scripts/deploy/migrate.php - 在
composer.json里只做轻量封装:"deploy:precheck": "@php scripts/deploy/precheck.php" - 钩子类脚本(如
post-install-cmd)失败时,默认不会中断主流程,但返回非零退出码会让后续同阶段脚本跳过——这点容易被忽略,建议脚本末尾加exit(0)显式收尾
最常被绕开的点是:脚本执行目录永远是 composer.json 所在位置,不是你当前终端所在路径;也没法配置工作目录。想切路径?只能自己写 cd path && cmd,而且得考虑跨平台兼容性。

















