Pular para o conteúdo principal

Entendendo o Sistema de Versionamento dos Componentes PHP ByJG

· 8 min para ler
Joao Gilberto Magalhaes
Startup / Founder / Developer

Entendendo o Sistema de Versionamento dos Componentes PHP ByJG

Gerenciar dependências entre múltiplos componentes PHP costumava ser um pesadelo. Quando você tem um ecossistema de mais de 30 pacotes interconectados, manter o controle de qual versão funciona com qual versão do PHP — e quais versões são compatíveis entre si — pode rapidamente se tornar algo incontrolável.

Foi por isso que redesenhei completamente a estratégia de versionamento para todos os componentes PHP ByJG. Este post explica a evolução do sistema de versionamento, como ele funciona hoje e como você pode usá-lo efetivamente em seus projetos.

O Problema: Antes do PHP 7.4​

Antes do PHP 7.4, cada componente do ecossistema ByJG tinha seu próprio esquema de versionamento independente.

Isso criava diversos desafios:

  • Inferno de Dependências: Era extremamente difícil identificar quais versões de diferentes componentes eram compatíveis entre si
  • Confusão de Versões PHP: Não havia uma maneira clara de saber quais versões do PHP uma versão específica de componente suportava
  • Pesadelo de Manutenção: Gerenciar patches e atualizações entre componentes com números de versão diferentes era complexo e propenso a erros
  • Experiência Ruim para o Desenvolvedor: Usuários tinham que pesquisar manualmente matrizes de compatibilidade antes de instalar componentes

Por exemplo, você poderia ter:

  • byjg/anydataset na versão 3.2.1
  • byjg/serializer na versão 2.5.0
  • byjg/migration na versão 4.1.2

E tentar descobrir quais versões funcionavam juntas — e com qual versão do PHP — exigia vasculhar documentação ou tentativa e erro.


A Solução: Versionamento Padronizado​

A partir do PHP 7.4, introduzi um sistema de versionamento padronizado em todos os componentes ByJG.

O princípio chave é simples:

A versão principal do componente indica quais versões do PHP ele suporta.

Isso cria um padrão claro e previsível que torna o gerenciamento de dependências significativamente mais fácil.

Matriz de Versão para Suporte PHP​

Versão do ComponenteVersões PHP SuportadasStatus
4.9.xPHP 7.4, 8.0, 8.1, 8.2Apenas manutenção (patches)
5.0.xPHP 8.1, 8.2, 8.3Apenas manutenção (patches)
6.0.xPHP 8.3, 8.4, 8.5Desenvolvimento ativo

Isso significa:

  • Se você está rodando PHP 8.4, deve usar a versão 6.0 dos componentes ByJG
  • Se ainda está no PHP 8.2, pode usar a versão 4.9 ou 5.0
  • Se precisa suportar PHP 7.4, a versão 4.9 é sua única opção

Benefícios Dessa Abordagem​

  1. Clareza Instantânea: Apenas olhando o número da versão, você sabe quais versões do PHP são suportadas
  2. Dependências Consistentes: Todos os componentes com a mesma versão principal são projetados para trabalhar juntos
  3. Upgrades Simplificados: Ao atualizar o PHP, você atualiza todos os componentes para a versão correspondente
  4. Melhor Manutenção: Separação clara entre linhas de versão torna o patch de versões específicas algo direto

Workflow de Desenvolvimento e Estratégia de Branches​

Entender como releases e patches funcionam é crucial tanto para contribuidores quanto para usuários do ecossistema.

A Estratégia da Branch Principal​

O workflow de desenvolvimento segue um padrão direto:

branch main/master
↓
Sempre contém a versão mais recente (atualmente 6.0.x)
↓
Releases são tagueados diretamente dessa branch

Pontos-Chave:

  • A branch main (ou master) sempre contém a versão mais recente do componente
  • Todo desenvolvimento de novas funcionalidades acontece na branch main
  • Quando um release está pronto, é tagueado diretamente da main (ex: v6.0.0, v6.0.1, etc.)
  • Isso garante que a branch main está sempre estável e pronta para release

Branches Específicas de Versão para Patches​

Quando um bug é descoberto em uma versão antiga que ainda precisa de suporte, usamos branches específicas de versão:

Branch 4.9 → Para patches da versão 4.9.x (PHP 7.4-8.2)
Branch 5.0 → Para patches da versão 5.0.x (PHP 8.1-8.3)
Branch 6.0 → Para patches da versão 6.0.x (PHP 8.3-8.5)

Exemplo de Workflow:

  1. Um bug crítico é encontrado na versão 5.0.x
  2. Crie uma branch de correção a partir da branch 5.0
  3. Aplique a correção e faça merge de volta para a branch 5.0
  4. Tagueie um novo patch release (ex: v5.0.8)
  5. Se aplicável, porte a correção para versões mais novas (6.0 ou main)

Essa abordagem garante:

  • Versões antigas permanecem estáveis e podem receber correções críticas
  • Sem interferência com o desenvolvimento ativo na branch main
  • Separação clara entre manutenção e novas funcionalidades

Melhores Práticas: Usando Componentes em Seu Projeto​

Recomendação #1: Use a Mesma Versão em Todos os Componentes​

Para garantir máxima compatibilidade e evitar conflitos de dependência, sempre use componentes da mesma versão principal.

Má Prática ❌:

{
"require": {
"byjg/anydataset": "^5.0",
"byjg/serializer": "^6.0",
"byjg/migration": "^4.9"
}
}

Boa Prática ✅:

{
"require": {
"byjg/anydataset": "^6.0",
"byjg/serializer": "^6.0",
"byjg/migration": "^6.0"
}
}

Recomendação #2: Use o Operador Circunflexo (^)​

O operador circunflexo (^) é a maneira recomendada de especificar restrições de versão:

{
"require": {
"byjg/anydataset": "^6.0"
}
}

O que ^6.0 significa:

  • Permite qualquer versão >= 6.0.0 e < 7.0.0
  • Você receberá atualizações de patch (6.0.1, 6.0.2, etc.) automaticamente
  • Você receberá atualizações menores (6.1.0, 6.2.0, etc.) automaticamente
  • Você não será automaticamente atualizado para a versão 7.0.0, que seria uma mudança com quebra de compatibilidade

Isso lhe dá o melhor equilíbrio de:

  • Estabilidade: Sem mudanças com quebra de compatibilidade de upgrades de versão principal
  • Segurança: Atualizações automáticas de patch para correções de bugs
  • Funcionalidades: Acesso a novas funcionalidades de versões menores sem intervenção manual

Testando Versões de Desenvolvimento​

Às vezes você precisa testar funcionalidades não lançadas ou ajudar com o desenvolvimento. Existem duas abordagens:

Opção 1: Definir Estabilidade Mínima (Todo o Projeto)​

Essa abordagem diz ao Composer para permitir versões de desenvolvimento para todos os pacotes:

{
"require": {
"byjg/anydataset": "^6.0",
"byjg/serializer": "^6.0"
},
"minimum-stability": "dev",
"prefer-stable": false
}

Como funciona:

  • "minimum-stability": "dev" permite ao Composer instalar versões dev
  • "prefer-stable": false" diz ao Composer para preferir versões de desenvolvimento sobre estáveis quando disponíveis
  • A restrição ^6.0 agora vai corresponder a branches 6.0.x-dev

Quando usar:

  • Quando você está ativamente desenvolvendo ou testando múltiplos componentes
  • Quando você quer testar o estado mais recente de todo o ecossistema

Cuidado: Isso afeta todas as dependências, não apenas componentes ByJG. Use com cuidado em ambientes de produção.

Opção 2: Fixar Componentes Específicos em Versões Dev​

Essa abordagem é mais direcionada e afeta apenas pacotes específicos:

{
"require": {
"byjg/anydataset": "6.0.x-dev",
"byjg/serializer": "^6.0",
"byjg/migration": "^6.0"
}
}

Como funciona:

  • "6.0.x-dev" explicitamente solicita a versão de desenvolvimento da branch 6.0
  • Outros pacotes continuam usando versões estáveis
  • Você pode misturar: testar a versão dev de um componente enquanto mantém outros estáveis

Quando usar:

  • Quando testando uma funcionalidade ou correção de bug específica em um único componente
  • Quando contribuindo para um componente específico
  • Quando você precisa de mais controle sobre quais pacotes usam versões dev

Comandos de Update do Composer​

Após alterar as restrições de versão:

# Atualizar todos os pacotes
composer update

# Atualizar apenas pacotes específicos
composer update byjg/anydataset

# Atualizar todos os pacotes byjg
composer update byjg/*

Estratégia de Migração Entre Versões​

Quando é hora de atualizar para uma nova versão do PHP (e consequentemente uma nova versão de componente), siga esta abordagem:

Passo 1: Verifique Sua Versão Atual do PHP​

php -v

Passo 2: Atualize Seu composer.json​

Altere todas as versões de componentes ByJG para corresponder à sua versão alvo do PHP:

{
"require": {
"php": "^8.4",
"byjg/anydataset": "^6.0",
"byjg/serializer": "^6.0",
"byjg/migration": "^6.0",
"byjg/rest": "^6.0"
}
}

Passo 3: Execute Composer Update​

composer update

Passo 4: Teste Sua Aplicação​

Execute sua suite de testes para capturar quaisquer mudanças com quebra de compatibilidade:

./vendor/bin/phpunit

Passo 5: Revise os Changelogs​

Verifique os changelogs de cada componente para mudanças com quebra de compatibilidade:

https://opensource.byjg.com/docs/php/[nome-do-componente]/

Ciclo de Vida de Suporte de Versões​

Entender o ciclo de vida de suporte ajuda você a planejar upgrades:

VersãoData de ReleaseDesenvolvimento AtivoPatches de SegurançaFim de Vida
4.9.x2020❌ Encerrado✅ Não2023
5.0.x2022❌ Encerrado✅ Não2025
6.0.x2025✅ Ativo✅ SimTBD

Desenvolvimento Ativo: Novas funcionalidades, melhorias e otimizações Patches de Segurança: Apenas correções de bugs críticos e atualizações de segurança


Exemplo do Mundo Real​

Vamos supor que você está construindo uma nova aplicação de API REST:

Sua Versão do PHP​

$ php -v
PHP 8.4.1

Seu composer.json​

{
"name": "minhaempresa/api",
"require": {
"php": "^8.4",
"byjg/rest": "^6.0",
"byjg/anydataset": "^6.0",
"byjg/migration": "^6.0",
"byjg/jwt-session": "^6.0",
"byjg/authuser": "^6.0"
},
"require-dev": {
"phpunit/phpunit": "^11.0"
}
}

Instalar Dependências​

composer install

Resultado: Composer instala as versões 6.0.x mais recentes de todos os componentes, garantindo:

  • ✅ Compatibilidade total com PHP 8.4
  • ✅ Todos os componentes funcionam juntos perfeitamente
  • ✅ Atualizações automáticas para patches e versões menores
  • ✅ Ecossistema estável e testado

Conclusão​

O sistema de versionamento padronizado para componentes PHP ByJG transforma o gerenciamento de dependências de um quebra-cabeça complexo em um processo direto.

Principais Conclusões:

  1. Versão do componente = compatibilidade de versão PHP — Versão 6.0 = PHP 8.3/8.4/8.5
  2. Sempre use a mesma versão principal em todos os componentes ByJG
  3. Use o operador circunflexo (^6.0) para estabilidade e atualizações ótimas
  4. Branch main = versão mais recente, branches de versão para patches
  5. Duas maneiras de testar versões dev: configurações de estabilidade para todo o projeto ou fixação por pacote

Seguindo essas diretrizes, você terá uma configuração de dependências sustentável e previsível que escala com sua aplicação.

Quer explorar todo o ecossistema? 👉 Visite https://opensource.byjg.com

Precisa verificar quais componentes estão disponíveis? 👉 Navegue pelo catálogo de componentes