一种简便的给 composer 包打补丁的方法

开发过程中,我们经常会遇到某个 composer 包有 bug,或者需要改动部分功能以满足自己的业务。如果你和包的发布者联系,一般不会很快得到更新,非共性的需求,基本也会被忽略掉。

这种情况下,需要我们自己解决了,有些包是解决类似需求的,比如 cweagans/composer-patches,但用起来还是很麻烦。

我个人实践中用了一种很简便的方法,原理也很简单,其实就是自己 COPY 出来需要改动文件,然后 composer 执行包的安装或更新后会自动覆盖掉原有的。

方法如下:

1、先进入 vendor/ 某个包的目录下,进行代码修改,注意修改期间,不要执行 composer 的安装或更新命令。

2、工程目录下创建目录 patches,保持包的修改文件路径,COPY 放在 patches 下面,参照下图:

一种简便的给 composer 包打补丁的方法

3、复制下面代码到 composer.json 的 scripts -> post-autoload-dump 下:

"@php -r \"passthru(sprintf(PHP_OS==='WINNT'?'xcopy %s /D /E /C /R /H /I /K /Y':'cp -rfv %s', 'patches/* vendor/'));\""

一种简便的给 composer 包打补丁的方法

这样就可以了。

本作品采用《CC 协议》,转载必须注明作者和本文链接
尊道贵德 / 多行布施
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 11

最简单的办法就是,在入口文件手动 require 文件进来,这样类已经被加载后,就不会再去加载 vendor 下的内容。

进阶一点儿的,可以配置 composer 的 autoload.exclude-from-classmap ,把指定的类排除掉,然后再在 autoload.classmap 把需要的加载进来,这样就是按需加载了。

还有办法就是自己使用 spl_autoload_register 实现一个自动加载器,优先级高于 composer 的自动加载即可。

1个月前 评论
扣丁禅师 (楼主) 1个月前
Rache1 (作者) 1个月前
扣丁禅师 (楼主) 1个月前
Rache1 (作者) 1个月前

最简单的办法就是,在入口文件手动 require 文件进来,这样类已经被加载后,就不会再去加载 vendor 下的内容。

进阶一点儿的,可以配置 composer 的 autoload.exclude-from-classmap ,把指定的类排除掉,然后再在 autoload.classmap 把需要的加载进来,这样就是按需加载了。

还有办法就是自己使用 spl_autoload_register 实现一个自动加载器,优先级高于 composer 的自动加载即可。

1个月前 评论
扣丁禅师 (楼主) 1个月前
Rache1 (作者) 1个月前
扣丁禅师 (楼主) 1个月前
Rache1 (作者) 1个月前
陈先生

最合理且最简单的方法? 自建一个 composer 仓库,自己加一个新的包 依赖于原包,调用的时候调用自己的类即可。

1个月前 评论
扣丁禅师 (楼主) 1个月前

规范点就是自己fork下来改动,然后自己在packagist.org 发布。最后通过composer安装自己改动的包。如果是bug的话,给原作者提交个isses以及推个补丁版本。

1个月前 评论
扣丁禅师 (楼主) 1个月前
6324红老嗨 1个月前

file

我是删除composer.jsonrequire
然后手动改 psr-4的对应路径

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!