Magento Meetup
Published in

Magento Meetup

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 lemprar 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

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

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.

--

--

O melhor portal nacional sobre Magento, com eventos, artigos e tutoriais.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Rafael Corrêa Gomes

Technology Director at Tillit Ecommerce, passionate to solve problems.