如何确保多个项目独立运行,通过Composer完全解除全局与局部依赖的关联?
- 内容介绍
- 文章标签
- 相关推荐
本文共计992个文字,预计阅读时间需要4分钟。
全局和局部依赖混杂,不是能否共存的问题,而是何时会突然崩塌的问题。真正分隔的关键不在安装方式,而在执行路径、自动加载器归属以及是否有显式控制输入口。
为什么which phpunit返回的不是项目里那个
PATH 环境变量从左到右匹配,而系统默认把 ~/.composer/vendor/bin(或 Windows 的 %APPDATA%\Composer\vendor\bin)放在前面。哪怕你项目里 vendor/bin/phpunit 是 v10.5,只要全局装了 v9.6,phpunit 命令就大概率调到旧版。
- 验证方法:运行
which phpunit,再用head -n 3 $(which phpunit)看脚本头是否指向全局autoload.php - 临时解决:进项目目录后,直接跑
./vendor/bin/phpunit—— 不依赖 PATH,不绕弯子 - CI/CD 脚本中必须写全路径,不能只写
phpunit;否则某次全局更新后,测试就静默降级
项目内 require-dev 工具为何还可能被全局 autoload 干扰
根本矛盾在于:CLI 工具二进制文件是 PHP 脚本,它自己决定加载哪个 autoload.php。有些工具(如旧版 PHPStan)的 bin 文件硬编码了 require __DIR__.'/../vendor/autoload.php',但没限定是项目还是全局的 vendor。
本文共计992个文字,预计阅读时间需要4分钟。
全局和局部依赖混杂,不是能否共存的问题,而是何时会突然崩塌的问题。真正分隔的关键不在安装方式,而在执行路径、自动加载器归属以及是否有显式控制输入口。
为什么which phpunit返回的不是项目里那个
PATH 环境变量从左到右匹配,而系统默认把 ~/.composer/vendor/bin(或 Windows 的 %APPDATA%\Composer\vendor\bin)放在前面。哪怕你项目里 vendor/bin/phpunit 是 v10.5,只要全局装了 v9.6,phpunit 命令就大概率调到旧版。
- 验证方法:运行
which phpunit,再用head -n 3 $(which phpunit)看脚本头是否指向全局autoload.php - 临时解决:进项目目录后,直接跑
./vendor/bin/phpunit—— 不依赖 PATH,不绕弯子 - CI/CD 脚本中必须写全路径,不能只写
phpunit;否则某次全局更新后,测试就静默降级
项目内 require-dev 工具为何还可能被全局 autoload 干扰
根本矛盾在于:CLI 工具二进制文件是 PHP 脚本,它自己决定加载哪个 autoload.php。有些工具(如旧版 PHPStan)的 bin 文件硬编码了 require __DIR__.'/../vendor/autoload.php',但没限定是项目还是全局的 vendor。

