Rails com Packwerk – Vantagens, Desvantagens e Melhores Práticas
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:
- Modularidade: Facilita a organização do código em módulos claros e bem definidos.
- Manutenção: Simplifica a manutenção ao limitar as dependências entre diferentes partes da aplicação.
- Escalabilidade: Melhora a escalabilidade do projeto ao promover uma arquitetura mais limpa e organizada.
- Prevenção de Acoplamento: Ajuda a prevenir o acoplamento excessivo entre diferentes partes do código.
- Testabilidade: Melhora a testabilidade ao promover unidades de código mais isoladas.
Desvantagens do Uso do Packwerk:
- Curva de Aprendizado: Pode haver uma curva de aprendizado para entender e aplicar corretamente os conceitos de modularidade.
- Complexidade Inicial: A introdução do Packwerk em projetos existentes pode ser complexa, exigindo um esforço inicial significativo.
- 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?
- Instalação: Adicione
gem 'packwerk'
ao seu Gemfile e executebundle install
. - Configuração: Use o comando
packwerk init
para gerar a configuração inicial. - Criação de Pacotes: Defina pacotes dentro da sua aplicação, especificando as dependências e as fronteiras de cada um.
- Refatoração: Mova o código existente para os pacotes apropriados, ajustando as dependências conforme necessário.
- 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
- Adicionar a Gem:
Abra o arquivoGemfile
da sua aplicação Rails e adicione a seguinte linha:gem 'packwerk'
- Instalar a Gem:
Execute o comando no terminal:bundle install
Passo 2: Inicialização do Packwerk
- Inicializar Packwerk:
No terminal, execute:
Este comando cria arquivos de configuração necessários, comobundle exec packwerk init
packwerk.yml
e a pastapacks/
.
Passo 3: Criação de Pacotes
- Definir Pacotes:
Dentro da pastapacks/
, crie subpastas para cada pacote que você deseja definir. Por exemplo:mkdir packs/accounting mkdir packs/sales
- Mover Código para Pacotes:
Mova os arquivos de código relevantes para as pastas dos pacotes correspondentes.
Passo 4: Configuração dos Pacotes
-
Definir Dependências:
Em cada pacote, crie ou edite o arquivopackwerk.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
- Ajustar Código:
Refatore o código conforme necessário para se adequar à nova estrutura de pacotes. - 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
- Verificar Pacotes:
Execute o comando para verificar se há violações nas fronteiras dos pacotes:bundle exec packwerk check
- 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
- 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. - 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.