Como aplicar bugfix no core do Magento 2?

Quem nunca precisou aplicar uma correção no core do Magento 2 que já foi solucionada no próximo release ou corrigida pelo seu time?

Como aplicar bugfix no core do Magento 2?

Quem nunca precisou aplicar uma correção no core do Magento 2 que já foi solucionada no próximo release ou corrigida pelo seu time através de um override ou plugin?

Uma boa prática é não versionar o core do Magento 2, que está na pasta vendor, caso queira conferir o .gitignore que recomendo, confira o post Meu Gitignore para Magento 2. Muitos desenvolvedores usam estratégias para lembrar daquele plugin ou override conforme vão atualizando os componentes do Magento utilizando composer update ou atualizando a versão do Magento como de 2.2 para 2.3. Essas estratégias podem ser:

  • Adicionar uma verificação de versão no código para gerar log ao mudar a versão do Magento
  • Colocar um nome sugestivo ao módulo como MyCompany/Bugfix224 para falar que é na versão Magento 2.2.4

Vantagens

Mesmo utilizando essas duas estratégias acima elas não são tão efetivas, elas exigem um processo manual e repetitivo de verificação que podem ser evitados, as principais vantagens de utilizar a maneira abaixo são:

  • Rapidamente replicável
  • Fácil de ser monitorado
  • Implementação rápida
  • Verificação automatica

Utilizando o Composer

A melhor solução que já vi foi utilizar o próprio Composer para fazer isso, para aplicar o bugfix você vai precisar da correção que alguém já disponibilizou via Patch ou um Patch que você mesmo pode criar via PHPStorm, como mostra a imagem abaixo.

Criando um patch com a IDE PHPStorm

1. Instalando composer-patches

Vamos começar instalando o composer-patches ele vai facilitar a instalação e o gerenciamento de patches.

composer require cweagans/composer-patches

2. Salve o arquivo do patch

Você pode criar uma pasta na raiz do seu Magento 2 chamada patches, pasta que vai ser utilizada para armazenar seus patches futuros (caso use Apache, coloque um .htaccess nessa pasta)

patches/13929_2.2.3_directory_resolver_composer_v1.patch

Esse arquivo vai conter um conteúdo comum em patches como esse:

--- /vendor/magento/framework/App/Filesystem/DirectoryResolver.php	2018-02-21 01:25:30.000000000 +0000
+++ /vendor/magento/framework/App/Filesystem/DirectoryResolver.php	2018-06-02 17:04:53.000000000 +0000
@@ -39,7 +39,7 @@
     public function validatePath($path, $directoryConfig = DirectoryList::MEDIA)
     {
         $realPath = realpath($path);
-        $root = $this->directoryList->getPath($directoryConfig);
+        $root = realpath($this->directoryList->getPath($directoryConfig));
         
         return strpos($realPath, $root) === 0;
     }

3. Modifique o composer.json

No seu composer.json tem uma sessão extra no fim do arquivo, nela você pode especificar uma mensagem e o arquivo do seu patch. Pode perceber que na mensagem está a especificação do número da issue do Github da Magento seguida da mensagem para sabermos do que se trata.

"extra": {
        "magento-force": "override",
        "patches": {
            "magento/framework": {
                "Issue #13929: Images can't be uploaded using WYSIWYG if media directory is a symlink": "./patches/13929_2.2.3_directory_resolver_composer_v1.patch"
            }
        }
    }

4. Aplique

Para finalizar aplique o patch usando o comando de instalação do Composer.
composer install

Aplicando Magento 2 patches usando Composer

Dicas Bônus

Se quiser gerar um patch de alguma alteração não feita pelo Git você pode usar esse comando:

diff -u arquivoOriginal.php arquivoAlterado.php > myPatch.patch

Se está falhando a aplicação do patch você pode usar o modo verbose para conseguir ver o por que não está dando certo:

composer install -vvvv

Se você for aplicar algo no vendor em um módulo específico, use dessa maneira no arquivo do patch e na configuração do Composer.json

Pode perceber que a rota do patch está apontando para o caminho já dentro da pasta do módulo Magento_Catalog.

Composer.json
Patch

Obrigado

Agradeço por ler esse post, agora eu gostaria de saber como você costuma aplicar patches? Deixe nos comentários abaixo.