Não prenda seu código Go ao GitHub

A prática do Go de usar URLs totalmente qualificadas (muitas vezes caminhos do GitHub) como identificadores de importação está gerando preocupação sobre estabilidade de longo prazo, dependência de fornecedor e migrações dolorosas quando repositórios mudam de lugar. Os comentaristas avaliam alternativas como domínios personalizados, proxies internos e vendoring de dependências, destacando trade-offs entre resiliência, segurança, conveniência e a carga operacional para mantenedores. Muitos argumentam que nenhum namespace é à prova de falhas, então o verdadeiro desafio é criar ferramentas e fluxos de trabalho que tornem mudanças de hosting e preservação de dependências administráveis ao longo do tempo.

Caminhos de importação do Go e dependência do GitHub

  • O design do Go de “import == caminho de rede” faz com que o host do repositório faça parte da superfície da API.
  • Muitos veem isso como frágil: migrar do GitHub para outra forge (ou até renomear a organização) significa tocar os caminhos de importação em muitos repositórios e tags históricas, quebrando builds antigos.
  • Outros argumentam que o problema é superestimado: uma migração rara mais search/replace ou go.mod replace é um custo aceitável.

Domínios personalizados / vanity URLs

  • Visão pró-domínio vanity: usar seu próprio domínio desacopla a identidade de qualquer forge específica; você pode redirecionar o DNS ou simples handlers web (nginx, templates do Hugo, servidores de vanity URL) para novos hosts mais tarde, ou até para um registry de artefatos.
  • Críticos temem que isso apenas mova o SPOF: domínios expiram, registradores podem apagar TLDs ou aumentar preços, e domínios abandonados podem ser tomados e usados de forma abusiva.
  • Para código fechado/interno, controlar o domínio é visto como mais razoável; para OSS de longa duração, alguns preferem um “grande host estável” como o GitHub.

Vendoring, proxies e reprodutibilidade

  • Alguns defendem fazer vendoring de dependências em todo projeto Go: melhora builds offline, a resiliência à desaparecimento upstream e o controle da cadeia de suprimentos.
  • Outros apontam desvantagens: repositórios inchados, operações git e CI mais lentas, trabalho manual de atualização, complexidade recursiva de dependências.
  • O proxy de módulos do Go (proxy.golang.org) e mirrors internos são citados como meio-termo: faz cache uma vez, depois constrói sem atingir o GitHub diretamente.

Dor de migração e escala organizacional

  • Vários comentaristas descrevem migrações reais (GitHub → outro host, mudanças de domínio) como “horríveis” em escala, especialmente com muitos repositórios e versões dependentes entre si.
  • search/replace simples quebra quando você precisa preservar a capacidade de reconstruir versões históricas; você acaba fazendo branch/tag de commits antigos só para reescrever caminhos de importação.
  • Monorepos com uma única versão de cada dependência evitam parte disso, mas introduzem seus próprios custos.

Segurança, integridade e design de sistemas de pacotes

  • Preocupações levantadas sobre:
    • Domínios/hosts mortos ou sequestrados servindo código malicioso.
    • A dependência do Go de localizações em vez de identificadores estáveis ou content addressing.
  • Melhorias sugeridas: imports com content-addressing, hashes em go.mod (não apenas em go.sum), módulos assinados, mecanismos melhores de redirecionamento/alias, ou fallback para arquivos como o Software Heritage.
  • Alguns veem a história de pacotes do Go como um sistema mal projetado que foi acumulando recursos (modules, proxies, replace) em vez de um design coerente baseado em registry.