你有没有遇到过这样的情况:在你的php项目里,某个 composer 依赖包几乎完美,但就是有一个小小的功能不符合你的需求,或者有一个 bug 需要你立即修复,而官方版本还没来得及更新?
这时候,你可能会想:直接去
vendor/
是的,你确实可以这么做。但问题是,一旦你运行
composer update
.patch
这种困境,相信很多PHP开发者都深有体会。它不仅浪费时间,还增加了项目维护的复杂性。那么,有没有一种既能灵活修改依赖包,又能保证修改不会被覆盖,同时还易于管理和团队协作的方案呢?
答案是肯定的!今天,我要向大家隆重推荐一个 Composer 生态中的神器——
migrify/vendor-patches
vendor
migrify/vendor-patches
.patch
cweagans/composer-patches
composer update
vendor
migrify/vendor-patches
接下来,让我们看看如何一步步使用
migrify/vendor-patches
1. 安装必要的依赖
首先,我们需要通过 Composer 安装
migrify/vendor-patches
cweagans/composer-patches
migrify/vendor-patches
dev
cweagans/composer-patches
<pre class="brush:php;toolbar:false;">composer require symplify/vendor-patches --dev # 如果需要在生产环境应用补丁,请务必安装 cweagans/composer-patches composer require cweagans/composer-patches
2. 复制你想要修改的 Vendor 文件并添加 .old
现在,假设你需要修改
vendor/nette/di/src/DI/Extensions/InjectExtension.php
.old
<pre class="brush:php;toolbar:false;">vendor/nette/di/src/DI/Extensions/InjectExtension.php # 这是你将要修改的原始文件 vendor/nette/di/src/DI/Extensions/InjectExtension.php.old # 这是原始文件的备份
3. 修改原始文件
现在,你可以大胆地打开
vendor/nette/di/src/DI/Extensions/InjectExtension.php
<pre class="brush:php;toolbar:false;"> if (DI\Helpers::parseAnnotation($rp, 'inject') !== null) { - if ($type = DI\Helpers::parseAnnotation($rp, 'var')) { // 原始代码 + if ($type = \App\Reflection\Helper\StaticReflectionHelper::getPropertyType($rp)) { // 我们的修改 + } elseif ($type = DI\Helpers::parseAnnotation($rp, 'var')) { // 兼容原始逻辑 $type = Reflection::expandClassName($type, Reflection::getPropertyDeclaringClass($rp));
一个非常棒的特性是:只有没有 .old
4. 运行 generate
当你的修改测试通过后,激动人心的时刻到了!运行
vendor-patches generate
.old
.patch
<pre class="brush:php;toolbar:false;">vendor/bin/vendor-patches generate
命令执行后,你会在项目根目录下看到一个
patches/
/patches/nette-di-di-extensions-injectextension.php.patch
更智能的是,
migrify/vendor-patches
composer.json
extra
cweagans/composer-patches
<pre class="brush:php;toolbar:false;">{ "extra": { "patches": { "nette/di": [ "patches/nette_di_di_extensions_injectextension.patch" ] } } }
如果你有特殊的补丁文件路径需求,也可以通过
--patches-file
<pre class="brush:php;toolbar:false;">vendor/bin/vendor-patches generate --patches-file=patches.json
5. 应用补丁
现在,万事俱备,只欠东风!你只需要运行标准的 Composer 安装命令,你的补丁就会被自动应用到
vendor
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">composer install
如果补丁没有成功应用,或者你想查看更详细的日志,可以使用
--verbose
<pre class="brush:php;toolbar:false;">composer install --verbose
小贴士: 如果你使用的是 macOS 系统,并且在应用补丁时遇到问题,可能是因为缺少
gpatch
<pre class="brush:php;toolbar:false;">brew install gpatch
使用
migrify/vendor-patches
vendor
cweagans/composer-patches
在现代PHP开发中,Composer 已经成为不可或缺的工具。而
migrify/vendor-patches
vendor
以上就是如何优雅地修改Composer依赖包?migrify/vendor-patches助你轻松管理Vendor补丁的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号