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
.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 ao net
pacote e aos pacotes que estão em qualquer uma de suas subpastas. O comando
go build ./...
freqü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
.
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 um go.mod
arquivo (ou um dos pais da pasta atual), a go
ferramenta é executada no modo com reconhecimento de módulo (o modo legado é denominado modo GOPATH ).
No modo de reconhecimento de módulo, GOPATH não define mais o significado das importações durante uma construção, mas ainda armazena dependências baixadas (em GOPATH / pkg / mod) e comandos instalados (em GOPATH / bin, a menos que GOBIN seja definido).
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) enquanto go 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ção go 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 go
Você também pode obter mais ajuda executando o seguinte comando:
go help build
Também é importante notar que a partir do Go 1.5 go install
também remove os executáveis criados por go build
( fonte ):
Se 'go install' (sem argumentos, significando o diretório atual) for bem-sucedido, remova o executável escrito por 'go build', se presente. Isso evita deixar um binário obsoleto para trás ...
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?
Para pacote:
go build
: cria seu pacote e depois descarta os resultados
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.
O que exatamente os comandos
go build
ego install
constroemSempre que a ferramenta go instala um pacote ou binário, ela também instala todas as dependências que possui, portanto, a execução de go install também instalará os pacotes dos quais seu programa depende (disponíveis publicamente, pacotes "go gettable"), automaticamente.
Na verdade ... go install
mudará também com Go 1.10, além do novo cache:
O
go install
comando " " não instala mais dependências dos pacotes nomeados ( CL 75850 ).Se você executar "
go install foo
", a única coisa instalada seráfoo
.Antes, isso variava. Se as dependências estiverem desatualizadas, "
go install
" também instalou quaisquer dependências.
A instalação implícita de dependências durante "go install
" causou muita confusão e dores de cabeça para os usuários, mas anteriormente era necessário habilitar compilações incrementais.
Não mais.
Achamos que a novainstall what I said
semântica " " será muito mais compreensível, especialmente porque fica claro a partir dos relatórios de bug que muitos usuários já os esperavam.
Para forçar a instalação de dependências durante "go install
", use o novo "go install -i
" , por analogia com "go build -i
" e "go test -i
".O fato de que "
go install
" costumava instalar quaisquer dependências reconstruídas causava confusão na maioria das vezes em conjunto com-a
, que significa "force rebuild of all dependencies
".
Agora, "go install -a myprog
" forçará uma reconstrução completa de todas as dependências domyprog
, assim como demyprog
si mesmo, mas apenasmyprog
será instalado. (Todas as dependências reconstruídas ainda serão salvas no cache de compilação, é claro.)
Fazer este caso funcionar de forma mais compreensível é especialmente importante em conjunto com a nova análise de desatualização baseada em conteúdo, porque ela vê boas razões para reconstruir dependências com mais frequência do que antes , o que aumentaria a confusão "por que minhas dependências foram instaladas".
Por exemplo, se você executar "go install -gcflags=-N myprog
", isso instalará ummyprog
construído sem otimizações do compilador, mas também não reinstala mais os pacotesmyprog
usados da biblioteca padrão sem otimizações do compilador.
go build
, faz get
? Eu tenho um erro de compilação cannot 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 reconstruindo https://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.