Quando usar replace?
Conforme descrito na seção go.mod, as diretivas replace
fornecem controle adicional no go.mod
do módulo principal do que é realmente usado para satisfazer uma dependência encontrada nos arquivos .go
ou go.mod
, enquanto as diretivas de replace
em módulos diferentes do módulo principal são ignorados na construção.
A diretiva replace
permite que você forneça outro caminho de importação (import path) que pode ser outro módulo localizado no VCS (GitHub ou outro lugar), ou em seu sistema de arquivos local com um caminho de arquivo relativo ou absoluto. O novo caminho de importação da diretiva replace
é usado sem a necessidade de atualizar os caminhos de importação no código-fonte real.
replace
permite o controle do módulo principal sobre a versão exata usada para uma dependência, como:
replace example.com/some/dependency => example.com/some/dependency v1.2.3
replace
também permite o uso de um fork de dependência, como:
replace example.com/some/dependency => example.com/some/dependency-fork v1.2.3
Você também pode fazer referência a branches, por exemplo:
replace example.com/some/dependency => example.com/some/dependency-fork master
Um exemplo de caso de uso é: se você precisar corrigir ou investigar algo em uma dependência, pode ter um fork local e adicionar algo como o seguinte em seu go.mod
do seu módulo principal:
replace example.com/original/import/path => /your/forked/import/path
replace
também pode ser usado para informar o conjunto de ferramentas go
da localização relativa ou absoluta no disco dos módulos em um projeto de vários módulos, como:
replace example.com/project/foo => ../foo
se o lado direito de uma diretiva replace
for um caminho do sistema de arquivos, o destino deve ter um arquivo go.mod
nesse local. Se o arquivo go.mod
não estiver presente, você pode criar um com go mod init
.
Em geral, você tem a opção de especificar uma versão à esquerda de => em uma diretiva replace
, mas normalmente é menos sensível a alterações se você omitir isso (por exemplo, como feito em todos os exemplos de substituição acima).
Você pode confirmar que está obtendo as versões esperadas executando go list -m all
, que mostra as versões finais reais que serão usadas em sua construção, incluindo a consideração de instruções de replace
.
No Go 1.11, para dependências diretas, uma diretiva require
é necessária mesmo se for feito um replace
. Por exemplo, se foo
é uma dependência direta, você não pode replace foo => ../foo
sem um require
correspondente para foo
. Se você não tiver certeza de qual versão usar na diretiva require
, você pode frequentemente usar v0.0.0
, como require foo v0.0.0
. Isso foi corrigido na versão 1.12 com #26241.
Consulte o próximo FAQ para obter os detalhes de como usar replace
para funcionar inteiramente fora do versionador de código.
Last updated