$ GOPATH no se debe establecer en $ GOROOT, ¿por qué no?
(4)
Agregue las siguientes líneas a su archivo .bashrc
:
export GOPATH=/home/user/workspace
export GOROOT=/home/user/go
export PATH=$GOPATH/bin:$PATH
Luego carga el bashrc: $ source .bashrc
He instalado Go en mi máquina Linux en /usr/local/go
, y pretendía usar /usr/local/go/src
para el desarrollo. Sin embargo cuando intento esto me sale el siguiente error:
$GOPATH must not be set to $GOROOT
Efectivamente como lo entiendo, esto significa que no debe usar /usr/local/go
para el desarrollo. Por qué no?
Debido a que /usr/local/go/src
ya contiene el código de la biblioteca estándar, debe mantener su propio código separado de ese.
Lo sé, otras herramientas de desarrollo no tendrían ningún problema con eso, pero Go es un poco más estricto en algunos aspectos. Probablemente sea la misma filosofía que se encuentra detrás de marcar las variables no utilizadas o importarlas como errores: evitar problemas que pueden parecer pequeños al principio, pero que pueden llevar a dolores de cabeza más grandes en el futuro.
Desde go help gopath
:
GOPATH debe configurarse para obtener, compilar e instalar paquetes fuera del árbol Go estándar.
Por lo tanto, GOROOT establece la ubicación de la biblioteca estándar , y GOPATH es para bibliotecas no estándar . Una biblioteca no debe estar en ambos lugares a la vez.
Este directorio puede estar donde está $GOROOT
, pero siempre puede verificarlo a través de go env
, y esto mostrará a GOROOT
como una de las variables de entorno:
$ go env
GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH=""
GORACE=""
GOROOT="/usr/local/Cellar/go/1.2.1/libexec" # <- its right here
GOTOOLDIR="/usr/local/Cellar/go/1.2.1/libexec/pkg/tool/darwin_amd64"
TERM="dumb"
CC="clang"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fno-common"
CXX="clang++"
CGO_ENABLED="1"
Por lo tanto, su instalación podría tenerlo en un lugar diferente, pero de cualquier manera no puede hacer la misma ruta para GOROOT
y GOPATH
, la razón es que su GOPATH
también tiene una carpeta src
, que alberga la biblioteca estándar:
@ /usr/local/Cellar/go/1.2.1/libexec/src/pkg
± % ls
archive container errors hash log path strconv text
bufio crypto expvar html math reflect strings time
builtin database flag image mime regexp sync unicode
bytes debug fmt index net runtime syscall unsafe
La razón por la que no puede tenerlos en el mismo lugar es porque cuando ejecuta go install
, se verá tanto en GOROOT
como en GOPATH
, y verá que todas sus importaciones como fmt
y os
están presentes tanto en GOROOT
como en GOPATH
, y así, el pobre compilador se confundirá y comenzará a gritarte (lo que hizo en tu caso).