Image
Composer

Recentemente conheci um sujeito peculiar em um encontro local de Drupaleiros. Peculiar por não usar Composer e nem Git em um projeto bem sucedido de e-commerce feito em Drupal. “Mas por que?” alguém perguntou à ele. “Porque eu nunca precisei” foi sua resposta. “E como você atualiza o Drupal e módulos?”. “Eu subo por FTP”. “Cara, você precisa aprender a usar Git e Composer”. “Mas eu nunca precisei disso pra manter meu site”.

Em grande parte eu concordo com essa pessoa. Para que usar ferramentas extras se o que você tem é o suficiente para o seu trabalho? Por outro lado, eu acho fundamental testar ferramentas amplamente usadas por desenvolvedores e tirar suas próprias conclusões quanto a utilidade da ferramenta. No caso do Composer, os benefícios são tão óbvios que apenas em raras ocasiões você terá razões para não usá-lo durante o desenvolvimento do seu projeto.

O que é Composer

Composer é um gerenciador de dependências de PHP. Em outras palavras, ele facilita a distribuição, instalação e atualização de programas escritos em PHP (pacotes). Como o Drupal e todos seus módulos e temas funcionam em PHP, usar Composer para gerenciar a instalação e atualização de todo o sistema torna-se conveniente.

diagrama composer

Tradicionalmente a instalação do Drupal envolve fazer download do arquivo zip no site oficial e descompactar na pasta onde você deseja rodar o website. Esse processo é tão simples que, à primeira vista, aprender a usar um gerenciador de dependências para instalar o Drupal não parece fazer sentido. Mas raramente você irá usar apenas o Drupal sem nenhum módulo ou tema adicional. Nesse caso você terá que fazer o download de cada módulo e descompactar manualmente. E muitos módulos costumam lançar atualizações frequentes, exigindo mais downloads manuais a cada atualização. Não bastasse isso, alguns módulos exigem download de outras bibliotecas para funcionar corretamente. E pode ocorrer o caso de dois módulos utilizarem a mesma biblioteca porém em versões diferentes. E na hora de desinstalar um módulo você pode facilmente esquecer de remover a biblioteca extra que você adicionou na mão. Chega de problemas, como é que funciona o tal do Composer?

O diagrama nessa página mostra basicamente como tudo funciona. Os pacotes PHP ficam guardados em um servidor remoto conhecido como repositório. Dentro da pasta do seu projeto, você tem um arquivo chamado composer.json. Esse arquivo lista todos os pacotes PHP a serem instalados. O Composer em si é um programa que lê esse arquivo dentro de sua pasta e vai buscar todos os pacotes PHP no repositório, fazendo os downloads automaticamente.

O repositório mais famoso (e que já vem por padrão) se chama Packagist. É possível conectar a outros repositórios, mas geralmente isso não será necessário.

Mão na massa

Vamos lá, como aplicar tudo isso na prática?

Primeiro você precisa instalar o Composer, que é um único arquivo executável de 2MB escrito em php feito para rodar no terminal. Detalhes sobre a instalação eu deixo ao nosso amigo Google.

Para iniciar um projeto em Drupal 9 use o comando

composer create-project drupal/recommended-project MEU_SITE

Esse comando irá criar uma pasta chamada MEU_SITE (claro que você pode substituir esse nome) com o Drupal inteiro já dentro desta pasta. Apesar dessa pasta conter todo o Drupal (atualmente em 23mil arquivos somando em 72MB) o único arquivo realmente importante é um chamado composer.json. Para provar isso, delete todos os arquivos dentro do MEU_SITE exceto o composer.json. Abra o terminal, vá para dentro da pasta MEU_SITE e rode esse comando

composer install

Voce verá que todos os arquivos que você removeu estarão de volta. Isso porque o arquivo composer.json contém a lista de todos os programas (dependências) PHP a serem instaladas. Se você usa git, você pode ignorar todos os 23 mil arquivos que vêm com o Drupal e apenas rastrear o composer.json. Show de bola!

Para adicionar um módulo contribuido use esse comando:

composer require drupal/NOME_DO_MODULO

Por exemplo, você pode instalar o módulo Field Group com o seguinte comando:

composer require drupal/field_group

Esse comando irá fazer o download to módulo Field Group e incluir na lista de pacotes instalados no composer.json.

Comandos que você irá usar 99% das vezes:

# Instalar todos os pacotes listados em composer.json
composer install

# Instalar um pacote
composer require NOME_DO_PACOTE

# Desinstalar um pacote
composer remove NOME_DO_PACOTE

# Fazer o update do pacote
composer update NOME_DO_PACOTE

# Fazer o update de todos os pacotes instalados
composer update

Existem outras funcionalidade mas isso é praticamente tudo que você vai precisar usar na grande maioria das vezes. Instalar e atualizar módulos assim fica bem mais fácil, concorda?

Existe alguma desvantagem?

Eu pessoalmente tenho uma pequena insatisfação: para instalar o Drupal usando Composer, você precisará de um computador com pelo menos 4GB de memória RAM porque ele é um devorador de memória durante a instalação inicial do Drupal. Pode parecer besteira porque qualquer computador ou laptop hoje em dia vem com pelo menos 8GB de memória RAM. Porém, pequenos e até médios sites que rodariam perfeitamente com 1GB de RAM acabam necessitando servidores com mais memória.

Para contornar esse problema, eu geralmente faço a instalação inicial do projeto no computador para depois subir todos os arquivos para o servidor. O Composer engasga para instalar o Drupal que é um projeto consideravelmente grande, mas uma vez instalado, os módulos contribuídos não necessitam de tanta memória quanto o próprio Drupal.

Comentários

Tenho uma dica para o problema de memória, ao fazer qualquer atualização com o composer. Sempre que da erro de falta de memória eu rodo:
set COMPOSER_MEMORY_LIMIT=99999999999&& php -d memory_limit=-1 c:\composer\composer.phar update (Isto no Windows)

Pronto, é só rodar novamente que instala. Seria interessante colocar esta dica no artigo.

Agora também tenho uma dúvida do composer.

Eu instalo um módulo do Drupal via Composer, depois vou lá e habilito o módulo no Drupal. O que gostaria de saber é se eu usar o Composer para desinstalar este mesmo módulo eu antes tenho que remover o módulo do Drupal ou o próprio Composer fará isto?

E se eu desinstalar o módulo no Drupal e esquecer de remover no Composer, a dependência no composer continuará, aí se eu der um "composer install" este módulo que tirei pelo Drupal será instalado novamente, certo?

Existem dois tipos de limites de memória. O limite imposto pelo PHP no arquivo php.ini (geralmente 128MB) e o limite do computador propriamente dito (normal ter 8GB hoje em dia).
"COMPOSER_MEMORY_LIMIT=99999999999" ou "memory_limit=-1" são basicamente a mesma coisa e tem como objetivo ignorar o limite imposto pelo PHP. Isso resolve o problema de memória imposto pelo PHP mas não resolve caso o uso de memória ultrapasse a capacidade física da máquina.
Uma alternativa para esse problema é aumentar a capacidade swap (uso do disco rígido como memória ram), mas isso na maioria das vezes é muito lento.

Últimos posts

13 Aug 2020 | By bdiasti

Guia para resolver problemas em Drupal :)

Quando estamos iniciando em determinada tecnologia ficamos meio perdidos em como vamos resolver determinado problema, por exemplo seu gerente pediu pra você criar um ranking das pessoas que mais contribuíram este mês com a comunidade Drupal, e ai como você começaria a resolução deste problema em Drupal?