因为vendor/是composer的只读缓存区,不是工作目录;每次composer install或update都会按composer.lock完全重装,手动修改必然被覆盖——这是设计使然,非bug。

vendor里改的代码为什么每次install都会丢
因为vendor/是 Composer 的只读缓存区,不是你的工作目录。只要运行composer install或composer update,它就会按composer.lock完全重装——你手动加的var_dump()、补丁逻辑、临时注释,全会被覆盖。这不是 bug,是设计使然。
常见错误现象包括:git status在vendor/下没反应;CI 构建后功能异常;团队成员本地能跑,别人机器上直接报错。
- 别把
vendor/提交进 Git(尤其带修改的文件) - 别指望“我本地改了就行”,部署和协作会立刻翻车
- 别尝试用
git stash或.gitignore保护 vendor 里的改动——路径本身就不该被 Git 跟踪
用 path 类型仓库替代直接修改 vendor
这是最轻量、可复现、且不破坏依赖一致性的方案:把想改的包复制到项目外目录,再通过repositories让 Composer 指向它。Composer 会创建软链接,改源码立刻生效,且不会被install覆盖。
使用场景:调试第三方包逻辑、验证补丁效果、还没决定是否提 PR 的临时修改。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 把包拷到项目同级目录,比如
../my-package-fix - 在项目
composer.json中添加:{ "repositories": [ { "type": "path", "url": "../my-package-fix" } ] } - 把
require里的版本改成"dev-main as 1.2.3"(假设原版是1.2.3,你本地分支叫main) - 运行
composer update vendor/package-name,它会删掉旧包,换成指向你本地目录的 symlink
注意:path模式下composer install会跳过网络请求,所以 CI 环境必须移除该配置或确保路径存在,否则报Package not found。
autoload.php 被重写怎么办
vendor/autoload.php是 Composer 自动生成的只读文件,你不该手动改它,也不该把它纳入版本控制。任何自定义加载逻辑,都得走composer.json的autoload字段配置。
- 新增类映射?在
autoload里加"psr-4"或"classmap"段 - 想加载全局函数?用
"files"数组列出.php路径 - 改完后必须运行
composer dump-autoload,而不是去编辑vendor/autoload.php - 如果用了
path仓库,记得在本地包的composer.json里也配好 autoload,否则类找不到
真要覆盖安装,别用 update
有人想“重装一遍 vendor 来清掉干扰”,却误用composer update——这会重新解析依赖树,可能升级版本、改composer.lock,甚至跳过某些包。真正需要的是严格按 lock 还原:
- 用
composer install --force-reinstall:强制重解压所有包、重建 autoload、重跑 post-install-cmd,但不删vendor、不改lock - 加
--no-dev跳过开发依赖;加--with-all-dependencies确保间接依赖也被刷新 - Windows 下失败?先关掉 PHP 服务、IDE 索引、终端占用,再试;仍不行就加
--prefer-dist避开 symlinks
复杂点在于:path 仓库和--force-reinstall互斥——前者依赖 symlink,后者会删 symlink 并试图重装,结果就是链接断裂。所以调试阶段用 path,上线前切回 packagist 源,再跑 install 或 force-reinstall。










