vendor目录不可手动修改,它是Composer根据composer.lock自动生成的物理镜像;所有依赖变更必须通过composer require/remove命令声明式操作,确保vendor结构、autoload映射与lock文件严格一致。

vendor 目录不是你“用”的地方,而是 Composer “替你管”的地方——所有操作必须绕过它直接作用于 composer.json 和命令行,手动碰它等于主动引入不一致。
vendor 目录为什么不能手动修改
它本质是 composer.lock 的物理镜像:每个包的版本、哈希、安装路径都严格锁定。一旦你删了 vendor/guzzlehttp/guzzle 或重命名成 guzzle,后果是:
- 下次
composer install会重新拉取并覆盖你的改动,但autoload_psr4.php仍按原路径注册,导致Class not found -
composer update可能卡在 “Package has modified files” 报错,必须先git checkout -- vendor/guzzlehttp/guzzle或加--no-scripts强制重装 - CI/CD 流程里如果依赖你“手动补全”的文件,部署时就会直接失败
正确添加/删除依赖只用两个命令
所有变更必须通过声明式操作触发,让 Composer 自动同步 vendor 结构和 autoload 映射:
- 加运行时依赖:
composer require guzzlehttp/guzzle:^7.8(自动更新composer.json、composer.lock,安装到vendor/guzzlehttp/guzzle) - 加开发依赖:
composer require --dev phpunit/phpunit:^10(进require-dev,且不会出现在生产环境composer install --no-dev中) - 删依赖:
composer remove monolog/monolog(比手动删目录安全得多,它会清理 autoload 映射、依赖树、甚至vendor/bin软链接)
autoload.php 引入路径写错是最常见的 Fatal error
入口文件(如 public/index.php)里这行代码看似简单,但路径错一丁点就崩:
- 错误写法:
require 'vendor/autoload.php';—— 当前工作目录不是项目根目录时,相对路径失效 - 正确写法:
require __DIR__ . '/../vendor/autoload.php';(用__DIR__锚定绝对位置) - 如果改过
config.vendor-dir,比如设成"lib/vendor",那这行就得同步改成:require __DIR__ . '/../lib/vendor/autoload.php'; - 千万别手改
vendor/autoload.php内容——它每次composer install或dump-autoload都会被重写
vendor 目录要不要提交到 Git
不要。它应该永远出现在 .gitignore 里,原因很实在:
- 体积大、变化频繁,拖慢 clone 和 diff
- 不同系统解压后文件权限/换行符可能不同,引发无意义冲突
- 真正决定依赖状态的是
composer.lock—— 它记录了每个包的精确版本和哈希值,composer install就靠它重建 vendor - 团队成员或 CI 机器只要执行
composer install,就能得到和你本地完全一致的 vendor 目录,不需要你传
最常被忽略的其实是 composer.lock 的提交时机:它必须和 composer.json 的变更一起提交,否则别人 composer install 装出来的依赖,可能和你测试时用的根本不是同一套。











