一种简便的给 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 协议》,转载必须注明作者和本文链接
YIN流黑客,开源作品uapp
本帖由系统于 2年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 11

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

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

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

2年前 评论
扣丁禅师 (楼主) 2年前
Rache1 (作者) 2年前
扣丁禅师 (楼主) 2年前
Rache1 (作者) 2年前

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

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

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

2年前 评论
扣丁禅师 (楼主) 2年前
Rache1 (作者) 2年前
扣丁禅师 (楼主) 2年前
Rache1 (作者) 2年前

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

2年前 评论
扣丁禅师 (楼主) 2年前

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

2年前 评论
扣丁禅师 (楼主) 2年前
6324红老嗨 2年前

file

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

2年前 评论

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