buf vs protoc: Ferramental Protobuf moderno vs o compilador
protoc é o compilador oficial de Protocol Buffers; buf envolve e moderniza o fluxo de trabalho com linting, detecção de breaking changes e gerenciamento de dependências.
protoc compila arquivos .proto para código via plugins, mas gerenciar includes, plugins e consistência é manual. buf oferece um fluxo de trabalho de nível mais alto (buf.yaml, lint, checagem de breaking changes, plugins remotos, um schema registry) sobre a mesma compilação.
| buf | protoc | |
|---|---|---|
| Papel | Fluxo: lint, breaking, generate | Compilador de referência |
| Linting | Integrado | Nenhum |
| Detecção de breaking changes | Integrada | Nenhuma |
| Gerenciamento de dependências | buf.yaml + registry | Include paths manuais |
| Config | buf.yaml / buf.gen.yaml | Flags de linha de comando / scripts |
Onde o buf vence
buf transforma protobuf em um fluxo de trabalho gerenciado: faz lint de schemas contra regras de estilo, detecta breaking changes contra um baseline, gerencia dependências e gera código com uma config clara. No CI isso captura mudanças de API incompatíveis antes que sejam publicadas, algo que o protoc puro não consegue fazer.
Onde o protoc ainda cabe
protoc é o compilador canônico e continua sendo a escolha certa para setups mínimos, plugins incomuns ou ambientes onde você não quer mais uma ferramenta. buf, no fim das contas, depende dos mesmos conceitos de geração, e alguns pipelines são simples o suficiente para que protoc via script seja suficiente.
No CI
Um pipeline comum roda buf lint e buf breaking em cada PR e, então, buf generate. Isso fornece gates de qualidade de schema que o protoc não tem. Se você só precisa de geração de código e tem um setup de plugins estável, protoc mais um script funciona.
O veredito
Use buf quando você quer linting de protobuf, detecção de breaking changes e dependências gerenciadas no CI; use protoc para necessidades de geração mínimas ou incomuns. A maioria dos times que mantêm schemas compartilhados se beneficia do buf.