composer.json 的 scripts 字段不支持路径配置,所有命令默认在项目根目录执行,路径解析依赖 shell 环境;应通过 composer exec 或配置 path 调用 vendor/bin 下命令,避免硬写相对路径。

composer.json 里的 scripts 字段不支持路径配置
Composer 的 scripts 字段只接受命令字符串或数组,它本身没有“查找路径”概念——所有脚本命令默认在项目根目录下执行,且路径解析完全依赖 shell 环境和当前工作目录。你写 "test": "phpunit",Composer 就直接调用 phpunit 命令,不会去 vendor/bin 或别处自动补前缀。
让脚本找到 phpunit、psalm 这类命令的真正方法
依赖包的二进制文件(如 phpunit、psalm)默认装在 vendor/bin/,但脚本里不能硬写 ./vendor/bin/phpunit——这会破坏可移植性,尤其在 Windows 和 CI 中容易出错。
- 最稳做法:把
vendor/bin加进当前 shell 的PATH,例如在终端运行export PATH="./vendor/bin:$PATH"(Linux/macOS)或在 CMD 执行set PATH=.\vendor\bin;%PATH% - CI 脚本中统一用
composer exec phpunit,它会自动在vendor/bin/下查找并执行,跨平台安全 - 如果用了自定义
bin-dir(比如"bin-dir": "tools"),必须确保该目录已存在,且脚本里显式调用tools/phpunit——但注意 Windows 下是复制文件,不是软链,权限可能被杀毒软件拦截
为什么在 scripts 里写相对路径经常失败
常见错误是写成 "cs-fix": "php ./tools/php-cs-fixer fix",看似路径明确,实则埋了三个坑:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
./tools/是相对于项目根目录,但 Composer 执行脚本时 cwd 不一定总是项目根(比如在子目录下运行composer run-script) -
php-cs-fixer可能依赖vendor/autoload.php,而它默认从当前目录找,不是从项目根找 - 某些插件(如
hirak/prestissimo)会改变进程工作目录,导致路径失效
真正可靠的方式是:所有脚本命令都用 composer exec 包一层,或者用 php -d autoload.php 显式指定自动加载器路径。
全局命令无法在 scripts 中直接调用?检查 COMPOSER_HOME 和 PATH 是否对齐
如果你在 scripts 里写了 "deploy": "laravel deploy" 却报 command not found,问题不在 Composer,而在环境变量没对齐:
- 运行
composer global config bin-dir --absolute确认laravel实际在哪 - 检查当前 shell 的
PATH是否包含该路径;Windows 上还要确认是系统级 Path 还是用户级,且没加尾部反斜杠 -
COMPOSER_HOME改了但没迁移auth.json?那laravel可能静默认证失败,表现为命令卡住或无输出
脚本执行环境继承的是启动终端的环境变量,IDE 内置终端往往不加载你的 .zshrc,所以即使终端里 laravel 能跑,PHPStorm 里也可能找不到——得手动配 CLI 解释器路径。










