如何在 vendor 目录中修改依赖包,同时允许其更新——cweagans/composer-patches补丁包的使用

235
0

你可以使用 cweagans/composer-patchessymplify/vendor-patches 生成和应用补丁,允许在 vendor 目录中修改依赖包,同时保持依赖更新功能。以下是详细步骤:

步骤 1:安装所需的 Composer 包

首先安装 cweagans/composer-patchessymplify/vendor-patches,用于生成和管理补丁。

composer require cweagans/composer-patches symplify/vendor-patches --dev

步骤 2:复制你要修改的文件

找到你要修改的文件,并将其复制一份,添加 .old 后缀。例如,如果你要修改 vendor/nette/di/src/DI/Extensions/InjectExtension.php,则复制文件:

cp vendor/nette/di/src/DI/Extensions/InjectExtension.php vendor/nette/di/src/DI/Extensions/InjectExtension.php.old

这样可以确保在修改时不会直接影响原文件,方便生成补丁。

步骤 3:修改原始文件

在不修改 .old 文件的前提下,直接编辑原始文件。下面是一个示例修改(假设修改依赖注入逻辑):

         if (DI\\Helpers::parseAnnotation($rp, 'inject') !== null) {
-           if ($type = DI\\Helpers::parseAnnotation($rp, 'var')) {
+           if ($type = \\Amateri\\Reflection\\Helper\\StaticReflectionHelper::getPropertyType($rp)) {
+           } elseif ($type = DI\\Helpers::parseAnnotation($rp, 'var')) {
               $type = Reflection::expandClassName($type, Reflection::getPropertyDeclaringClass($rp));

步骤 4:生成补丁文件

在完成修改后,运行 symplify/vendor-patches 提供的 generate 命令来生成补丁文件:

vendor/bin/vendor-patches generate

该工具会自动生成补丁文件并保存在 patches/ 目录中,例如:

patches/nette-di-di-extensions-injectextension.php.patch

步骤 5:自动配置补丁到 composer.json

symplify/vendor-patches 还会自动在你的 composer.json 中配置补丁路径:

{
    "extra": {
        "patches": {
            "nette/di": [
                "patches/nette_di_di_extensions_injectextension.patch"
            ]
        }
    }
}

步骤 6:运行 Composer 安装补丁

最后,运行以下命令让 Composer 安装依赖并应用补丁:

composer install

总结

  1. 安装 cweagans/composer-patchessymplify/vendor-patches
  2. 复制要修改的文件并将其命名为 .old
  3. 修改原始文件并确保运行正常。
  4. 使用 vendor-patches generate 生成补丁文件。
  5. 运行 composer install 以应用补丁。

相关文章:【一种简便的给 composer 包打补丁的方法】

参考:How to Patch a Package in Vendor, Yet Allow its Updates

Leave a Reply

Your email address will not be published. Required fields are marked *