You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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.jsoncomposer.lock
    git add composer.json composer.lock
    git commit -m "使用自定义fork的laravel/framework版本"
    git push heroku main
    

这样Heroku部署时会拉取你fork后的依赖,你的修改就会一直存在。


内容的提问来源于stack exchange,提问作者odbhut.shei.chhele

火山引擎 最新活动