composer run 是推荐的现代写法,composer run-script 是兼容旧版的底层命令;前者语义清晰、支持参数透传,后者语法冗长且易出错。

composer run 和 composer run-script 有什么区别?
直接说结论:composer run 是推荐的现代写法,composer run-script 是兼容旧版的底层命令,日常几乎不用手敲。
-
composer run test→ 自动识别scripts中的"test",语义清晰,支持参数透传(如composer run test -- --filter=FooTest) -
composer run-script test→ 功能相同但语法冗长,不支持简写参数透传,且容易因空格、引号、大小写出错 - 脚本名含冒号或破折号(比如
"ci:lint"或"dev-start")时,composer ci:lint会报错,必须用composer run-script "ci:lint"(注意双引号,Windows 下尤其关键) -
run-script默认会触发 pre-/post- 钩子;若只想跑脚本本身,得加--no-hooks,而run不带该行为
scripts 里写的命令为什么没执行?
不是配置完就自动跑——它只是注册任务,必须显式调用或绑定到生命周期钩子才生效。
- 常见错误现象:
composer install后什么都没发生 → 检查你写的是"post-install-cmd"还是自定义名如"my-install";后者不会自动触发,得手动composer run my-install - 脚本名拼错、大小写不一致、多了空格或中文标点,都会报
Script not found;最可靠验证方式是运行composer run --list查看当前可用命令 - PHP 脚本没加
php前缀(如写成"build": "build.php"),Linux/macOS 下可能因缺少可执行权限失败;稳妥写法是"build": "php build.php" - 脚本中用了
phpunit却没装在全局,又没写./vendor/bin/phpunit→ CI 环境大概率报command not found
怎么让 PHP 脚本访问项目类和配置?
Composer 执行 scripts 时默认不加载 vendor/autoload.php,所以直接 new App\Service\Xxx() 会报 Class not found。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 最稳妥做法:在 PHP 脚本开头第一行加上
require __DIR__ . '/vendor/autoload.php'; - 别依赖
$_ENV或.env文件——Composer 不自动读取它们;需要环境变量就得显式用putenv('APP_ENV=production')或通过exec("APP_ENV=production php ...") - 如果脚本要复用框架逻辑(比如 Laravel 的
Artisan命令),优先走php artisan xxx而非自己 new 实例;避免重复初始化容器 - 想跨平台兼容(比如 Windows 不认
rm -rf),别写 shell 命令,改用 PHP 脚本:"clear-cache": "php -r \"array_map('unlink', glob('var/cache/*'));\""
post-install-cmd 和 post-update-cmd 怎么安全跑数据库迁移?
这类钩子适合自动化部署,但失败必须中断流程,否则 CI 可能上线半截数据库。
- 务必加
--no-interaction,否则php artisan migrate在 CI 里会卡住等待确认 - 生产环境强制加
--force,否则 Laravel 默认拒绝执行(避免误操作):"@php artisan migrate --no-interaction --force" - 多个迁移命令建议用数组形式,顺序执行且任一失败即终止:
"post-update-cmd": ["@php artisan migrate --no-interaction", "@php artisan db:seed --no-interaction"] - 如果迁移逻辑复杂(比如要判断分支、跳过某些环境),别硬写 shell,改用 PHP 类回调:
["MyMigrator::run"],并在类里做完整校验和异常抛出
最容易被忽略的一点:所有脚本都在项目根目录执行,不是你当前终端所在路径;cd 必须显式写进命令里,不能靠“我以为它会自动 cd 进去”。

















