Como aplicar seus próprios patches a pacotes do Composer

Usar pacotes de terceiros pode acelerar o desenvolvimento do seu projeto. Às vezes, pode ser necessário adicionar funcionalidade extra ou corrigir um bug crítico. Veja como aplicar patches a pacotes PHP instalados pelo Composer.
Quando corrigir um pacote
Primeiro, considere se é apropriado criar um patch no projeto. Um patch deve ser sempre uma pequena alteração. Se você precisar adicionar uma nova funcionalidade extensa, deverá abrir um problema no pacote ou bifurcá-lo você mesmo. Isso ajudará a evitar conflitos conforme o pacote evolui.
Você deve pensar cuidadosamente se a mudança necessária é realmente específica para o seu projeto. Os patches de dependência geralmente afetam apenas algumas linhas de código. Eles tratam de bugs e problemas que, de outra forma, impediriam você de usar o pacote. A maioria dos patches são de curto prazo. Eles devem ser substituídos posteriormente por correções no código-fonte na base de código do pacote.
Em última análise, você precisa avaliar suas intenções. Você está abordando um problema imediato com um pacote ou estendendo a funcionalidade do pacote para alinhá-lo com sua base de código? Se for o último, você deve considerar contribuir com o pacote ou envolvê-lo com classes e funções extras que são cidadãos de primeira classe em seu projeto.
Criando um patch do Composer
Depois de fazer a chamada para o patch, você pode começar a preparar seu projeto. O Composer não tem suporte de patch integrado, então usaremos o popular projeto simplify / vendor-patches para adicioná-lo. Isso fornece uma interface intuitiva sobre cweagans / composer-patches para ajudá-lo a criar novos patches.
composer requer --dev symplify / vendor-patches
Certifique-se de que o pacote que você precisa para corrigir esteja instalado em seu projeto:
compositor requer example / broken-package
Em seguida, abra o arquivo problemático em seu editor de código. Você o encontrará no diretório do fornecedor. Em nosso exemplo, precisamos editar vendor / example / broken-package / src / Broken. php:
<? php class Broken & # 123; publicfunction __construct & # 40; string | int $ foo & # 41; & # 123; if & # 40; is_string & # 40; $ foo & # 41; & # 41; & # 123; echo " Valor válido! & quot ;; & # 125; & # 125; & # 125; ? >
A classe Broken deve aceitar strings e inteiros, usando os tipos de união do PHP 8 ’. Infelizmente, olhar a fonte mostra que ela só aceita strings.
Em nosso exemplo fictício, o mantenedor do pacote reconheceu o problema, mas ainda não criou uma nova versão. Vamos corrigir nosso problema enquanto isso.
Copie o arquivo corrompido, inalterado, e adicione um sufixo . old:
cp vendor / example / broken-project / src / Broken. php vendor / example / broken-project / src / Broken. php. old
Certifique-se de não editar o arquivo . old!
A seguir, edite o arquivo original para que funcione corretamente em sua base de código. Conforme você está editando no local, as alterações entram em vigor imediatamente. Verifique se sua base de código agora se comporta conforme o esperado.
<? php class Broken & # 123; publicfunction __construct & # 40; string | int $ foo & # 41; & # 123; if & # 40; is_string & # 40; $ foo & # 41; & # 41; & # 123; echo " Valor válido! & quot ;; & # 125; elseif & # 40; is_int & # 40; $ foo & # 41; & # 41; & # 123; echo " Também válido! & Quot ;; & # 125; & # 125; & # 125; ? >
Criando o arquivo de patch
Agora você pode usar o projeto symplify / vendor-patches para criar um arquivo de patch para sua correção. O pacote fornece um binário de patches do fornecedor que verifica automaticamente o diretório do seu fornecedor para encontrar as alterações que você fez.
vendor / bin / vendor-patches generate
Executar o comando irá gerar um diff para você. Ele será salvo no diretório de patches na raiz do seu projeto. A diferença é calculada comparando os arquivos . php e . php. old que você criou.
Você pode executar o comando novamente para descobrir quaisquer novos patches que adicionar. Cada arquivo alterado obtém seu próprio patch no diretório de patches.
Patch automático
No seu arquivo composer. json, você &’ verá que uma nova seção foi adicionada:
{" extra & quot ;: {" patches & quot ;: {" example / broken-package & quot ;: [" patches / example-broken-package-src-broken-php. patch " ]}}}
O objeto patches mapeia os nomes dos pacotes instalados para uma série de arquivos de patch a serem aplicados. Esses patches serão aplicados automaticamente sempre que você instalar o Composer.
Um script de instalação é registrado por simplify / vendor-patches. Ele é chamado depois que cada dependência é instalada. O script verifica se algum patch foi definido para o pacote. Ele aplicará automaticamente tudo o que encontrar.

Você verá linhas na saída da instalação do composer indicando quando os patches foram aplicados. Se um erro for relatado, você pode usar composer install --verbose para obter mais informações sobre por que o patch foi ignorado. Isso geralmente ocorre devido a uma atualização de pacote que corrige o problema corrigido, tornando o arquivo de patch redundante.
Removendo patches
Você pode remover temporariamente um patch excluindo sua linha de composer. json. Isso interromperá a aplicação do patch durante a instalação do compositor.
Para excluir permanentemente um patch de seu projeto, remova sua linha composer. json. Você pode então remover o arquivo . patch do diretório de patches do seu projeto.
Se quiser reverter um patch que aplicou localmente, é mais simples seguir os passos acima para excluir ou desabilitar o patch. Em seguida, você pode remover o pacote do diretório do fornecedor e executar composer install para voltar ao zero.
Nenhum comentário