Rails com Packwerk – Vantagens, Desvantagens e Melhores Práticas

Rails com Packwerk – Vantagens, Desvantagens e Melhores Práticas
Photo by Anoir Chafik / Unsplash

Me recordo de quando iniciei na Locaweb, existia uma gem que jamais havia ouvido falar, que se chamava gem dry e depois fui investigar, existem diversos projetos que resolvem os problemas do MVC tradicional para aplicar arquiteturas diferentes e não acoplar o código, uma delas é a packwerk. É interessante você saber que existe, talvez nunca trabalhe, mas se um dia precisar, está aqui uma breve visão.

Packwerk é uma gem para aplicações Rails que ajuda a manter a modularidade e a separação de preocupações dentro de grandes bases de código. Neste post, exploraremos as vantagens e desvantagens do uso do Packwerk, quando e por que utilizá-lo, e como ele pode ser uma ferramenta importante para o desenvolvimento de aplicações Rails.

O que é Packwerk?

Packwerk é uma gem que permite a criação de pacotes dentro de uma aplicação Rails, ajudando a definir fronteiras claras entre diferentes partes do código. Isso é especialmente útil em grandes aplicações, onde a complexidade pode crescer rapidamente.

Vantagens do Uso do Packwerk:

  1. Modularidade: Facilita a organização do código em módulos claros e bem definidos.
  2. Manutenção: Simplifica a manutenção ao limitar as dependências entre diferentes partes da aplicação.
  3. Escalabilidade: Melhora a escalabilidade do projeto ao promover uma arquitetura mais limpa e organizada.
  4. Prevenção de Acoplamento: Ajuda a prevenir o acoplamento excessivo entre diferentes partes do código.
  5. Testabilidade: Melhora a testabilidade ao promover unidades de código mais isoladas.

Desvantagens do Uso do Packwerk:

  1. Curva de Aprendizado: Pode haver uma curva de aprendizado para entender e aplicar corretamente os conceitos de modularidade.
  2. Complexidade Inicial: A introdução do Packwerk em projetos existentes pode ser complexa, exigindo um esforço inicial significativo.
  3. Overhead de Gerenciamento: Em projetos menores, o uso do Packwerk pode adicionar uma camada de gerenciamento que pode não ser necessária.

Quando Usar o Packwerk?

  • Em aplicações Rails de grande porte, onde a modularidade e a separação de preocupações são críticas.
  • Em projetos que estão crescendo rapidamente e começam a mostrar sinais de acoplamento excessivo.
  • Quando se planeja uma refatoração significativa de uma base de código existente.

Como Usar o Packwerk?

  1. Instalação: Adicione gem 'packwerk' ao seu Gemfile e execute bundle install.
  2. Configuração: Use o comando packwerk init para gerar a configuração inicial.
  3. Criação de Pacotes: Defina pacotes dentro da sua aplicação, especificando as dependências e as fronteiras de cada um.
  4. Refatoração: Mova o código existente para os pacotes apropriados, ajustando as dependências conforme necessário.
  5. Verificação: Utilize o comando packwerk check para verificar se há violações nas fronteiras dos pacotes.

Melhores Práticas:

  • Comece Pequeno: Comece com um número pequeno de pacotes e expanda conforme necessário.
  • Documentação: Documente as responsabilidades e as dependências de cada pacote.
  • Testes: Garanta que cada pacote tenha sua própria suíte de testes.
  • Revisão de Código: Use revisões de código para garantir que as fronteiras dos pacotes sejam respeitadas.

Packwerk é uma ferramenta poderosa para manter a modularidade em aplicações Rails de grande porte. Embora possa adicionar alguma complexidade inicial, os benefícios a longo prazo em termos de manutenção e escalabilidade são significativos. Ao seguir as melhores práticas e entender quando e como usá-lo, você pode tirar o máximo proveito dessa ferramenta para melhorar a qualidade e a sustentabilidade do seu código.

Vamos para uma prática

Pré-requisitos:

  • Uma aplicação Rails existente.
  • Conhecimento básico de Ruby e Rails.
  • Ruby e Rails instalados no seu ambiente de desenvolvimento.

Passo 1: Instalação da Gem Packwerk

  1. Adicionar a Gem:
    Abra o arquivo Gemfile da sua aplicação Rails e adicione a seguinte linha:
    gem 'packwerk'
    
  2. Instalar a Gem:
    Execute o comando no terminal:
    bundle install
    

Passo 2: Inicialização do Packwerk

  1. Inicializar Packwerk:
    No terminal, execute:
    bundle exec packwerk init
    
    Este comando cria arquivos de configuração necessários, como packwerk.yml e a pasta packs/.

Passo 3: Criação de Pacotes

  1. Definir Pacotes:
    Dentro da pasta packs/, crie subpastas para cada pacote que você deseja definir. Por exemplo:
    mkdir packs/accounting
    mkdir packs/sales
    
  2. Mover Código para Pacotes:
    Mova os arquivos de código relevantes para as pastas dos pacotes correspondentes.

Passo 4: Configuração dos Pacotes

  1. Definir Dependências:
    Em cada pacote, crie ou edite o arquivo packwerk.yml, especificando as dependências desse pacote.

    Exemplo para packs/accounting/packwerk.yml:

    enforce_dependencies: true
    enforce_privacy: false
    dependencies:
      - sales
    

Passo 5: Refatoração e Ajustes

  1. Ajustar Código:
    Refatore o código conforme necessário para se adequar à nova estrutura de pacotes.
  2. Atualizar Rotas e Referências:
    Certifique-se de que todas as rotas e referências internas estão apontando para os locais corretos dos arquivos nos pacotes.

Passo 6: Verificação e Testes

  1. Verificar Pacotes:
    Execute o comando para verificar se há violações nas fronteiras dos pacotes:
    bundle exec packwerk check
    
  2. Executar Testes:
    Garanta que todos os testes da aplicação estejam passando. Ajuste os testes conforme necessário para refletir a nova estrutura de pacotes.

Passo 7: Manutenção Contínua

  1. Revisões de Código:
    Durante as revisões de código, verifique se as mudanças respeitam as fronteiras e dependências dos pacotes.
  2. Documentação:
    Mantenha a documentação dos pacotes atualizada, explicando a responsabilidade e as dependências de cada um.

Parabéns! Você agora implementou a gem Packwerk na sua aplicação Rails. Isso ajudará a manter sua base de código mais organizada, modular e fácil de manter à medida que ela cresce. Lembre-se de que a manutenção da modularidade é um processo contínuo e requer atenção constante à medida que novos recursos são adicionados ou existentes são modificados.

Seja crítico no uso das ferramentas ou gems, utilize somente quando de fato fizer sentido.

Referências

Shopify - Packwerk

Read more