拒绝BUG – 使用composer-patches为composer包打补丁

最近在开发一个Laravel项目的时候,用到了一个 passport-multiauth 的包。但是这个包对 psr-http-message-bridge 这个包的依赖没有更新,导致了一系列的BUG。详情可以看这个Issue: Class ‘Symfony\\Bridge\\PsrHttpMessage\\Factory\\DiactorosFactory’ not found #124

虽然这个Bug已经有修复方法了,但是 passport-multiauth 包的作者还没merge并发布更新到composer上,所以我们还是得在本地修改文件。

这里又引出了一个问题,我们本地直接在vendor文件里的修改,是不会被git读取的。这就意味着,我们线上用 git clone 下来的项目里的 passport-multiauth 这个包还是没被更改的。

我随即想到一个我在Node.JS上用过的一个操作,就是把这个代码从vendor文件中复制出来,放到项目下,然后把调用都改过来。

但不同于Node.JS项目的是,这个Laravel项目下,如果要更改调用的话需要更改很多文件,同时也不方便与以后更新 passport-multiauth 版本。

上文提到我遇到的这个问题已经有人在GitHub上提出解决方案并开了一个PR,但作者只是说了已经查看过这个PR,但是还没发布更新到composer上,所以我就想是不是可以直接用这个PR做一个“先行版”的更新呢?

有的!这里就要向大家介绍一个composer包,cweagans/composer-patches | GitHub – cweagans/composer-patches。它可以用来给Composer包打补丁的包。


首先,我们需要先安装 composer-patches

composer require cweagans/composer-patches

通过阅读在GitHub上的文档,我们可以知道,我们可以通过多种方法修改composer.json文件就可以实现给指定包打上指定的补丁。

一、仅修改 composer.json 文件

{
	"require": {
		"cweagans/composer-patches": "~1.0",
		"drupal/core-recommended": "^8.8",
	},
	"config": {
		"preferred-install": "source"
	},
	"extra": {
		"patches": {
			"drupal/core": {
				"Add startup configuration for PHP server": "https://www.drupal.org/files/issues/add_a_startup-1543858-30.patch"
			}
		}
	}
}

这种方法下,我们只需要在 composer.json 的 extra 字段下添加 patches 项,然后给某个包指定一个patch。

二、通过 composer.patches.json 文件来维护这些包的补丁

这种方法下,我们以后要添加或去除补丁的时候,不再需要去修改 composer.json 文件,而是通过专门的文件 composer.patches.json 进行维护。

首先需要在你的项目中添加一个 composer.patches.json 文件来保存这些补丁信息,示例如下

{
	"patches": {
		"vendor/project": {
			"Patch title": "http://example.com/url/to/patch.patch"
		}
	}
}

然后需要在 composer.json 的 extra 中设置 patches-file 为你的composer.patches.json的相对路径

{
	"require": {
		"cweagans/composer-patches": "~1.0",
		"drupal/core-recommended": "^8.8",
	},
	"config": {
		"preferred-install": "source"
	},
	"extra": {
		"patches-file": "local/path/to/your/composer.patches.json"
	}
}

这个 patches 可以是 .patch 文件或者是 .diff 文件,并且同时支持从网络地址或者是本地文件。更多信息可以查看作者提供的文档 GitHub – cweagans/composer-patches

设置好补丁后,我们需要通过 composer update 或 composer install 来引用补丁。


后记:

1. 错误:patch: command not found

值得一提的是,在windows环境下,因为没有windows没有自带的 patch 命令,所以需要通过安装 git bash 来实现。

当然,你也可以使用其他像是 gnuWin32 之类的小工具实现,但是我不推荐,因为这些小工具大多年久失修。以 gnuWin32 为例,自从 Windows 7 的UAC规则更改之后,gnuWin32 就无法正常打开使用,需要自行编译一个支持 UAC 规则的版本。我试过折腾了一早上,无果。

2.获取 GitHub 上 commit 的 diff 文件

Compatibility Update #123 为例,在PR中,我们可以找到commit的详细内容 Commit – Compatibility Update #123 我们只需要在这个commit的地址尾部加上 .diff 即可获取到这个 commit 对应的 diff 文件。

https://github.com/sfelix-martins/passport-multiauth/commit/fe9cbf8302585a583311fa08554cfc71ec85ecdf.diff

我们可以直接在 composer.patches.json 中通过链接加入这个补丁或者先把这个补丁下载到项目中,然后通过路径来应用这个补丁。

分享到:

0 条评论

昵称

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

与博主谈论人生经验?