Los programadores nuevos de Go a menudo no saben o se confunden lo que hace el comando fundamental de compilación de Go.
¿Qué es exactamente el go build
y go install
comandos de construir y de dónde poner el resultado / salida?
go
build
compilation
icza
fuente
fuente
Respuestas:
Lo que hace el
go
comando depende de si lo ejecutamos para un paquete "normal" o para el especial"main"
paquete .Para paquetes
go build
construye su paquete y luego descarta los resultados .go install
builds luego instala el paquete en su$GOPATH/pkg
directorio.Para comandos (paquete
main
)go build
construye el comando y deja el resultado en el directorio de trabajo actual .go install
crea el comando en un directorio temporal y luego lo mueve a$GOPATH/bin
.A que pasar
go build
?Puede pasar paquetes a
go build
paquetes que desee compilar. También puede pasar una lista de.go
archivos de un solo directorio, que luego se trata como la lista de archivos de origen que especifican un solo paquete.Si no se proporcionan paquetes (rutas de importación), la compilación se aplica en el directorio actual.
Una ruta de importación puede contener uno o más
"..."
comodines (en cuyo caso es un patrón )....
puede coincidir con cualquier cadena, por ejemplo,net/...
coincide con elnet
paquete y los paquetes que se encuentran en cualquiera de sus subcarpetas. El comandoa menudo se usa para construir el paquete en la carpeta actual y todos los paquetes que se descargan. Este comando emitido en la raíz de un proyecto crea el proyecto completo.
Para obtener más información sobre cómo especificar paquetes, ejecute
go help packages
.Respecto a los módulos
El soporte preliminar para los módulos Go se introdujo en Go 1.11, y los módulos se volvieron predeterminados a partir de Go 1.13. Cuando la
go
herramienta se ejecuta desde una carpeta que contiene ungo.mod
archivo (o uno de los padres de la carpeta actual), lago
herramienta se ejecuta en modo compatible con módulos (el modo heredado se llama modo GOPATH ).Al construir módulos, lo que se construye se especifica en la lista de construcción . La lista de compilación contiene inicialmente solo el módulo principal (el módulo que contiene el directorio donde
go
se ejecuta el comando), y las dependencias del módulo principal se agregan a la lista de compilación, de forma recursiva (también se agregan las dependencias de las dependencias).Para obtener más información, ejecute
go help modules
.Básicamente, puede usar
go build
como verificación de que los paquetes se pueden construir (junto con sus dependencias) mientras quego install
también (permanentemente) instala los resultados en las carpetas adecuadas de su$GOPATH
.go build
terminará silenciosamente si todo está bien, y le dará mensajes de error si los paquetes no se pueden construir / compilar.Siempre que la
go
herramienta instala un paquete o binario, también instala las dependencias que tenga, por lo que la ejecucióngo install
también instalará los paquetes de los que depende su programa (disponibles públicamente, paquetes "go gettable"), automáticamente.Para empezar, lea la página oficial Cómo escribir código Go .
Más información sobre la
go
herramienta: Command goTambién puede obtener más ayuda ejecutando el siguiente comando:
También vale la pena señalar que a partir de Go 1.5
go install
también se eliminan los ejecutables creados porgo build
( fuente ):Para completar la lista,
go run
compila su aplicación en una carpeta temporal e inicia ese binario ejecutable. Cuando la aplicación se cierra, limpia correctamente los archivos temporales.Pregunta inspirada por Dave Cheney's What does go build build?
fuente
Por paquete:
Eso no será cierto después de Go 1.10 (Q1 2018), gracias a CL 68116 y CL 75473 . Vea este hilo , al que hago referencia aquí.
En realidad ...
go install
cambiará también con Go 1.10, además del nuevo caché:fuente
go build
haceget
? Tengo un error de compilacióncannot find package "github.com/spf13/cobra" in any of:…
. No sé cómo decirlo para conseguirlo. ¿Necesito obtener explícitamente?go.mod
archivo?go version go1.11.4 linux/amd64
. No sé acerca de go.mod. Estoy reconstruyendohttps://github.com/cbroglie/mustache/blob/master/cmd/mustache/main.go
, es extraño ya que acabo de compilar todo el paquete, y estoy usando este ejemplo como base, y creé una versión más básica que funcionó (pero sin usar esta biblioteca). No veo cómo no se instaló con el paquete de bigote.