Golang: Usando Go Modules com mono-repo (evitando o erro unknown revision)

Compartilhe

Fala pessoal. Essa semana eu estava desenvolvendo um sistema em Golang e passei pelo seguinte desafio: Usar apenas um repositório privado no Github, com dois módulos dentro do mesmo repositório. O erro unknown revision me assombrou por dias!

Inicialmente, eu não tinha percebido que o problema seria este, eu pensava que poderia usar 2 módulos em um mesmo repositório sem nenhuma configuração a mais. Então veio a surpresa:

go: github.com/marcellribeiro/ecotec/[email protected]: reading github.com/marcellribeiro/ecotec/pkg/pkg/[email protected] at revision pkg/v1.0.3: unknown revision pkg/v1.0.3

Ao verificar meu repositório no Github, pude constatar que as tags estavam criadas corretamente. Pra quem não sabe, o Go Modules faz um versionamento conectando diretamente com as Tags no seu repositório.

Posteriormente, comecei a crer que era algum tipo de permissão de acesso que estava faltando, por se tratar de um repositório privado. Então tentei resolver das formas mais comuns que encontrava pela internet:

Setando o GOPRIVATE

go env -w GOPRIVATE=github.com/marcellribeiro/*

Trocando o tipo de conexão no ~/.gititconfig

git config --global url."[email protected]:".insteadof="https://github.com"
  • Isto faz com que o Golang procure os pacotes através de SSH (a Key já deve estar instalada corretamente) ao invés de HTTPS.

Verificando a variável GO111MODULE

go env -w GO111MODULE=on

Verificando o token de acesso pessoal

git config --global url."https://:[email protected]:marcellribeiro".insteadOf "https://github.com/marcellribeiro"

E aí? Nada ainda?

Quando eu já não sabia o que fazer, levei a discussão para o meu amigo Madson e ficamos batendo cabeça por uns 2 dias, testando uma coisa ou outra.. Nós dois já havíamos percebido que uma resolução mais simples seria dividir os módulos em repositórios diferentes, mas a gente realmente queria encontrar uma solução mais plausível, então ele fez o seguinte:

  • Começou a validar se um mix de Go Modules + mono-repo requer alguma configuração extra;
  • Tentou isolar/cercar o problema criando um repo contendo os arquivos da pasta pkg (um dos módulos) contento uma tag v0.0.1;
  • Mudou todos os imports do projeto, dando um replace nas referências;

Até que funcinou e ele começou a analisar e fazer testes mais profundos na nomenclatura das tags…. e BAM!

Ele descobriu que a resolução era muito mais simples, bastava colocar o nome do módulo secundário (o tal pkg), na nomenclatura da tag. Então, no Github, ele criou a tag pkg/v0.0.1 e tudo funcionou perfeitamente. Não precisa mudar nada no go.mod, o require continua normal, basta alterar apenas a versão:

github.com/marcellribeiro/ecotec/pkg v0.0.1

Em vermelho você pode ver as tags que não funcionaram em mono-repo e em azul a tag que funcionou normalmente, concatenando o nome do módulo com a versão.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *