scripts必须置于composer.json顶层,键名和字符串值须用双引号;钩子名post-install-cmd与post-update-cmd触发时机不同;命令支持字符串、数组、php回调三种写法;传参需用--分隔;工作目录为项目根,但path不含vendor/bin且不自动加载.env。

直接写在 composer.json 顶层的 scripts 对象里,拼错名、放错位置、漏引号,脚本就“不存在”——不是报错,是彻底静默不执行。
scripts 必须放在 composer.json 顶层,不能嵌套
它不是 config 或 extra 的子字段,而是和 name、require 并列的根级键。常见错误写法:
-
"extra": { "scripts": { "dev:serve": "php -S localhost:8000" } }→ 不生效 -
"config": { "scripts": { ... } }→ 完全被忽略
正确结构只有这一种:
{
"name": "my/app",
"require": { ... },
"scripts": {
"dev:serve": "php -S localhost:8000",
"post-install-cmd": ["@php scripts/init.php"]
}
}
JSON 双引号不能省:键名和字符串值都必须用双引号,dev:serve 写成 dev:serve(无引号)或单引号会解析失败。
钩子名别写错:post-install-cmd 和 post-update-cmd 触发时机完全不同
这两个名字最常被混用,但行为差异直接影响 CI/CD 是否可靠:
-
post-install-cmd:只在vendor/为空时运行(首次composer install),后续再跑install不触发 -
post-update-cmd:每次composer update或composer install --with-dependencies都会执行
CI 环境中如果清理缓存写在 post-install-cmd,依赖更新后缓存可能残留,导致行为不一致。更稳妥的做法是把清理类操作统一放到 post-update-cmd,或手动加 composer run-script post-update-cmd 补救。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
命令怎么写:字符串 vs 数组 vs PHP 回调
三种写法对应不同场景,选错容易出路径、环境、参数问题:
- 单条 shell 命令用字符串:
"test": "vendor/bin/phpunit"—— 注意别直接写phpunit,PATH 不一定包含全局命令 - 多条命令优先用数组:
"pre-start": ["@php -v", "npm run build"]—— 避免 shell 解析差异(比如 Windows 下&&不认) - PHP 回调要确保自动加载就绪:
"build:config": ["App\Scripts\ConfigBuilder::run"]—— 类必须已通过autoload注册,否则报Class 'App\Scripts\ConfigBuilder' not found
数组里以 @ 开头的项(如 @php)会被 Composer 递归解析,自动使用当前项目绑定的 PHP 版本,比硬写 php 更安全。
传参和调试:-- 是分隔符,$argv 不可靠
Composer 不解析参数,-- 后的内容才透传给命令。漏掉它,参数就丢在半路:
- ✅ 正确:
composer test:unit -- --filter=testLogin - ❌ 错误:
composer test:unit --filter=testLogin→phpunit收不到--filter
PHP 脚本里别依赖 $argv,索引易偏移;优先读 $_SERVER['COMPOSER_ARGS'](Composer 4.0+ 提供),它直接是 -- 后的参数数组。调试时加 -v 看真实执行命令,或临时插 echo 打点,比如:
"post-install-cmd": ["echo '>> vendor built'", "@php scripts/check-env.php"]
真正容易被忽略的是工作目录和环境变量:Composer 执行脚本时当前目录是项目根目录,但 $PATH 不含 vendor/bin,.env 也不会自动加载——这些都得脚本自己处理。










