scripts中定义的命令不生效,是因为仅顶层显式定义的脚本(如"test": "phpunit")才支持composer run-script手动调用;事件钩子(如post-install-cmd)由Composer自动触发,不可手动执行,且需严格匹配脚本名大小写、连字符,并注意dev环境默认启用,生产环境需加--no-dev。

scripts 中定义的命令为什么 run-script 不生效?
直接执行 composer run-script xxx 失败,大概率是因为脚本名拼写错误、作用域不对,或没加 --no-dev 参数干扰了环境判断。Composer 的 scripts 是分环境的:post-install-cmd 这类事件钩子只能由 Composer 自动触发,而自定义脚本(比如 "build": "php build.php")才支持手动调用。
- 检查
composer.json的scripts字段下是否真有你要调用的键名,注意大小写和连字符(build-js≠buildjs) - 如果脚本定义在
require-dev依赖相关的钩子里(如post-autoload-dump),手动run-script不会触发它们——这些是内部事件,不是可执行命令 - 默认情况下,
composer run-script会加载 dev 环境配置;若脚本依赖生产环境行为(比如跳过某些 dev-only 工具),需显式加--no-dev
如何正确执行自定义 scripts 命令
只有显式定义在 scripts 对象顶层的键才是可手动运行的“命令”,比如 "test": "phpunit" 或 "cs-fix": "php-cs-fixer fix"。执行时不需要加 script: 前缀,也不用写完整路径。
- 运行方式就是
composer run-script test,不是composer run-script script:test,后者会报错Script 'script:test' is not defined - 想传参数给脚本?用双横线分隔:
composer run-script build -- --env=prod,后面的--env=prod会透传给底层命令(如 PHP 脚本的$argv) - 如果脚本里用了
$COMPOSER_DEV_MODE环境变量做分支判断,注意composer run-script默认设为1;要模拟生产环境,得加--no-dev或手动COMPOSER_DEV_MODE=0 composer run-script xxx
常见错误:脚本执行但没反应或报错找不到命令
现象是终端只打印一行空输出,或提示 sh: phpunit: not found,本质是 PATH 隔离或工作目录问题。Composer 执行 scripts 时会切换到项目根目录,但不会自动把 vendor/bin 加进 PATH——除非你用了 bin-dir 配置且命令被正确 symlink。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 优先用相对路径调用本地二进制:
"test": "vendor/bin/phpunit",而不是"test": "phpunit" - 如果脚本是 PHP 文件,别漏掉
php前缀:"build": "php build.php",写成"build": "build.php"会因缺少 shebang 或执行权限失败 - Windows 下注意路径分隔符和 shell 差异;用
php -r "echo 'ok';"替代复杂命令能快速验证执行链是否通畅
调试 scripts 执行过程的实用技巧
加 -v 或 --verbose 只显示命令行本身,看不出实际执行逻辑。真正有用的是让 Composer 输出每一步展开后的命令。
- 用
composer run-script xxx -v查看是否识别到脚本定义,以及它最终拼出的 shell 命令 - 在脚本命令前加
echo "running:" &&临时调试,比如"debug": "echo \"PWD: $(pwd)\" && echo \"PATH: $PATH\"" - 遇到权限问题(尤其 macOS/Linux 上的
.phar文件),先chmod +x vendor/bin/php-cs-fixer再试
手动触发 scripts 的核心就三条:脚本必须是 scripts 顶层键、命令名严格匹配、路径和环境变量得自己兜底。没人替你 resolve vendor/bin,也没人帮你判断当前是不是 production mode。

















