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?
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.
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
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.
Obrigado
Agradeço por ler esse post, agora eu gostaria de saber como você costuma aplicar patches? Deixe nos comentários abaixo.