在日常开发中,可能会遇到以下几种情况:
- Composer 包存在 Bug:有时候,使用的第三方 Composer 包中可能存在问题,但官方更新往往不能及时修复这些 Bug。
- 特定功能需求:某些业务场景下,你可能需要对 Composer 包进行一些定制修改,官方包不一定会提供你需要的特定功能。
常见问题:
- 每次更新时修改会被覆盖:直接修改
vendor/
下的包文件会导致每次运行composer install
或composer update
时,这些修改被官方的包重新覆盖。 - 联系包作者不一定有效:如果问题是非常具体或个性化的修改,包的发布者可能不会考虑将修改合并到官方版本中。
解决方案:
可以用cweagans/composer-patches
包来解决问题,但是配置起来有些麻烦。
为了避免这种情况,文章中介绍了一种简便的给 Composer 包打补丁的方法。该方法主要利用 Composer 的 scripts
机制,让开发者能够在不修改 vendor/
目录的情况下,自动应用自己所需的修改。
具体操作步骤:
- 修改
vendor/
下的包代码:首先在vendor/
目录下找到需要修改的文件并进行更改。这一步是临时的,不会永久保留。 - 创建
patches
目录:在项目的根目录下创建一个patches/
目录,保留所有对vendor/
文件的修改。这个目录应该保持与vendor/
中包的文件路径结构一致。 - 在
composer.json
中添加脚本:通过在composer.json
文件中加入post-autoload-dump
脚本,每次 Composer 更新依赖或重新生成自动加载文件时,自动将patches/
中的文件覆盖到vendor/
目录中。这段脚本的作用是通过简单的文件复制命令,将patches
目录中的文件重新复制到vendor/
目录中。 - 运行
composer dump-autoload
:当你完成修改并配置脚本后,每次运行composer dump-autoload
或composer update
时,Composer 会自动调用这个脚本,将你的补丁文件应用到vendor/
目录下。
"scripts": {
"post-autoload-dump": [
"@php -r \"passthru('cp -r patches/* vendor/');\""
]
}
优势:
- 无需每次手动修改:通过
composer.json
的脚本机制,自动化地将补丁应用,节省了每次手动修改的工作。 - 减少修改被覆盖的风险:即使执行
composer update
重新安装了第三方包,修改过的部分也可以通过补丁自动恢复,避免了每次更新后修改被覆盖的问题。
这套流程适合开发者在短时间内解决第三方包的问题,特别是官方更新不及时或功能无法满足需求的场景下。它通过自动化方式来减少手动操作,保持代码稳定。
参考:文章链接。