Os novos programadores de Go geralmente não sabem ou ficam confusos com o que o comando fundamental go build faz.
O que exatamente os comandos go build
e go install
constroem e onde eles colocam o resultado / saída?
go
build
compilation
icza
fonte
fonte
Respostas:
O que o
go
comando faz depende se o executamos para um pacote "normal" ou para o"main"
pacote especial .Para pacotes
go build
constrói seu pacote e então descarta os resultados .go install
compila e instala o pacote em seu$GOPATH/pkg
diretório.Para comandos (pacote
main
)go build
constrói o comando e deixa o resultado no diretório de trabalho atual .go install
cria o comando em um diretório temporário e o move para$GOPATH/bin
.Para o que passar
go build
?Você pode passar pacotes para os
go build
pacotes que deseja construir. Você também pode passar uma lista de.go
arquivos de um único diretório, que é então tratada como a lista de arquivos de origem especificando um único pacote.Se nenhum pacote (caminhos de importação) for fornecido, a construção será aplicada ao diretório atual.
Um caminho de importação pode conter um ou mais
"..."
curingas (nesse caso, é um padrão )....
pode corresponder a qualquer string, por exemplo,net/...
corresponde aonet
pacote e aos pacotes que estão em qualquer uma de suas subpastas. O comandofreqüentemente usado para construir o pacote na pasta atual e todos os pacotes retornando para baixo. Este comando emitido em uma raiz de projeto constrói o projeto completo.
Para mais informações sobre como especificar pacotes, execute
go help packages
.Em relação aos módulos
O suporte preliminar para módulos Go foi introduzido no Go 1.11 e os módulos se tornaram padrão a partir do Go 1.13. Quando a
go
ferramenta é executada a partir de uma pasta que contém umgo.mod
arquivo (ou um dos pais da pasta atual), ago
ferramenta é executada no modo com reconhecimento de módulo (o modo legado é denominado modo GOPATH ).Ao construir módulos, o que é construído é especificado pela lista de construção . A lista de construção contém inicialmente apenas o módulo principal (o módulo que contém o diretório onde o
go
comando é executado), e as dependências do módulo principal são adicionadas à lista de construção, recursivamente (as dependências das dependências também são adicionadas).Para mais informações, execute
go help modules
.Basicamente, você pode usar
go build
como uma verificação se os pacotes podem ser compilados (junto com suas dependências) enquantogo install
também (permanentemente) instala os resultados nas pastas apropriadas do seu$GOPATH
.go build
será encerrado silenciosamente se tudo estiver OK e fornecerá mensagens de erro se os pacotes não puderem ser compilados / compilados.Sempre que a
go
ferramenta instala um pacote ou binário, ela também instala todas as dependências que possui, portanto, a execuçãogo install
também instalará os pacotes dos quais seu programa depende (disponíveis publicamente, pacotes "go gettable"), automaticamente.Para começar, leia a página oficial How to Write Go Code .
Mais informações sobre a
go
ferramenta: Command goVocê também pode obter mais ajuda executando o seguinte comando:
Também é importante notar que a partir do Go 1.5
go install
também remove os executáveis criados porgo build
( fonte ):Para completar a lista,
go run
compila seu aplicativo em uma pasta temporária e inicia o binário executável. Quando o aplicativo é encerrado, ele limpa corretamente os arquivos temporários.Pergunta inspirada no livro de Dave Cheney What does go build build?
fonte
Para pacote:
Isso não será verdade depois do Go 1.10 (primeiro trimestre de 2018), graças a CL 68116 e CL 75473 . Veja este tópico , que faço referência aqui.
Na verdade ...
go install
mudará também com Go 1.10, além do novo cache:fonte
go build
, fazget
? Eu tenho um erro de compilaçãocannot find package "github.com/spf13/cobra" in any of:…
. Não sei como dizer para conseguir. Eu preciso obter explicitamente?go.mod
arquivo?go version go1.11.4 linux/amd64
. Não sei sobre go.mod. Estou reconstruindohttps://github.com/cbroglie/mustache/blob/master/cmd/mustache/main.go
, é estranho porque acabei de construir o pacote inteiro e estou usando este exemplo como base, e criei uma versão mais básica que funcionou (mas não usando esta biblioteca). Não consigo ver como não foi instalado com o pacote bigode.