如何在Heroku中保留vendor文件夹的修改内容?
解决Heroku上Laravel项目修改vendor文件后丢失的问题
你碰到的这个问题太典型了——vendor文件夹默认是被Git忽略的,而且Heroku在部署Laravel项目时,会自动执行composer install重新拉取所有依赖并生成完整的vendor目录,所以你本地修改的vendor文件根本没被推送到Heroku服务器上,部署后自然就没了。
下面给你几个可行的解决方案,按推荐程度排序:
1. 用Composer补丁工具管理修改(最推荐的正规做法)
直接修改vendor文件是不规范的,后续composer update很容易覆盖你的改动。用cweagans/composer-patches可以帮你把修改做成补丁,让Git追踪补丁文件,部署时自动应用:
- 先安装补丁工具:
composer require cweagans/composer-patches --dev - 在本地修改好vendor里的目标文件后,生成补丁文件(比如你改了
vendor/laravel/framework/src/Illuminate/SomeClass.php):# 先让Git临时追踪这个文件,才能生成diff git add vendor/laravel/framework/src/Illuminate/SomeClass.php --intent-to-add git diff vendor/laravel/framework/src/Illuminate/SomeClass.php > patches/laravel-framework-someclass-fix.patch - 在项目根目录的
composer.json里添加补丁配置:"extra": { "patches": { "laravel/framework": { "修复SomeClass中的某个问题": "patches/laravel-framework-someclass-fix.patch" } } } - 提交补丁文件和composer.json的修改:
git add patches/laravel-framework-someclass-fix.patch composer.json git commit -m "Add patch for laravel framework SomeClass" git push heroku main
这样Heroku在执行composer install时,会自动把补丁应用到对应的依赖文件上,你的修改就会保留下来。
2. 临时解决方案:让Git追踪单个修改的vendor文件(不推荐长期用)
如果你只是临时改个小地方应急,可以修改.gitignore,让Git追踪你修改的那个具体文件:
- 打开项目根目录的
.gitignore,在/vendor这行下面添加:
(把路径换成你实际修改的文件路径)!/vendor/laravel/framework/src/Illuminate/SomeClass.php - 提交这个文件到Git:
git add vendor/laravel/framework/src/Illuminate/SomeClass.php git commit -m "临时保留修改的vendor文件" git push heroku main
⚠️ 注意:这个方法只能临时用,因为下次你执行composer install或者composer update时,这个文件很可能被覆盖,而且长期维护起来非常麻烦,第三方依赖的更新会和你的修改冲突。
3. Fork第三方依赖包(长期维护大改动的方案)
如果你的修改比较复杂,需要长期维护,最好fork对应的依赖包到自己的GitHub账号,然后用自己的fork版本替代官方包:
- 在GitHub上fork你要修改的依赖(比如laravel/framework),把fork后的仓库clone到本地,在上面做修改,提交后推送到自己的fork仓库。
- 修改项目的
composer.json,指定使用你的fork版本:"repositories": [ { "type": "vcs", "url": "https://github.com/你的GitHub用户名/framework.git" } ], "require": { "laravel/framework": "dev-你的分支名" } - 执行
composer update laravel/framework,更新依赖到你的fork版本。 - 提交
composer.json和composer.lock:git add composer.json composer.lock git commit -m "使用自定义fork的laravel/framework版本" git push heroku main
这样Heroku部署时会拉取你fork后的依赖,你的修改就会一直存在。
内容的提问来源于stack exchange,提问作者odbhut.shei.chhele




