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

397
0

在日常开发中,可能会遇到以下几种情况:

  1. Composer 包存在 Bug:有时候,使用的第三方 Composer 包中可能存在问题,但官方更新往往不能及时修复这些 Bug。
  2. 特定功能需求:某些业务场景下,你可能需要对 Composer 包进行一些定制修改,官方包不一定会提供你需要的特定功能。

常见问题:

  • 每次更新时修改会被覆盖:直接修改 vendor/ 下的包文件会导致每次运行 composer installcomposer update 时,这些修改被官方的包重新覆盖。
  • 联系包作者不一定有效:如果问题是非常具体或个性化的修改,包的发布者可能不会考虑将修改合并到官方版本中。

解决方案:

可以用cweagans/composer-patches包来解决问题,但是配置起来有些麻烦。

为了避免这种情况,文章中介绍了一种简便的给 Composer 包打补丁的方法。该方法主要利用 Composer 的 scripts 机制,让开发者能够在不修改 vendor/ 目录的情况下,自动应用自己所需的修改。

具体操作步骤:

  1. 修改 vendor/ 下的包代码:首先在 vendor/ 目录下找到需要修改的文件并进行更改。这一步是临时的,不会永久保留。
  2. 创建 patches 目录:在项目的根目录下创建一个 patches/ 目录,保留所有对 vendor/ 文件的修改。这个目录应该保持与 vendor/ 中包的文件路径结构一致。
  3. composer.json 中添加脚本:通过在 composer.json 文件中加入 post-autoload-dump 脚本,每次 Composer 更新依赖或重新生成自动加载文件时,自动将 patches/ 中的文件覆盖到 vendor/ 目录中。这段脚本的作用是通过简单的文件复制命令,将 patches 目录中的文件重新复制到 vendor/ 目录中。
  4. 运行 composer dump-autoload:当你完成修改并配置脚本后,每次运行 composer dump-autoloadcomposer update 时,Composer 会自动调用这个脚本,将你的补丁文件应用到 vendor/ 目录下。
"scripts": {
    "post-autoload-dump": [
        "@php -r \"passthru('cp -r patches/* vendor/');\""
    ]
}

优势:

  • 无需每次手动修改:通过 composer.json 的脚本机制,自动化地将补丁应用,节省了每次手动修改的工作。
  • 减少修改被覆盖的风险:即使执行 composer update 重新安装了第三方包,修改过的部分也可以通过补丁自动恢复,避免了每次更新后修改被覆盖的问题。

这套流程适合开发者在短时间内解决第三方包的问题,特别是官方更新不及时或功能无法满足需求的场景下。它通过自动化方式来减少手动操作,保持代码稳定。

参考:文章链接

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注