$ GOPATH не должен быть установлен в $GOROOT, почему бы и нет?
Я установил Перейти на мою машину Linux в /usr/local/go
и намеревался использовать /usr/local/go/src
для разработки. Однако, когда я пытаюсь это сделать, я получаю следующую ошибку:
$GOPATH must not be set to $GOROOT
Эффективно, как я понимаю, это означает, что вы не должны использовать /usr/local/go
для разработки. Почему бы и нет?
Ответы
Ответ 1
Потому что /usr/local/go/src
уже содержит код для стандартной библиотеки, и вы должны оставить свой собственный код отдельно от него.
Я знаю, что другие инструменты разработки не будут иметь проблем с этим, но Go немного более строг в некотором роде. Это, вероятно, та же самая философия, которая лежит за пометкой неиспользуемых переменных или импорта как ошибок - избегая проблем, которые могут сначала казаться маленькими, но могут привести к большему числу головных болей в будущем.
Ответ 2
От go help gopath
:
GOPATH должен быть установлен для получения, сборки и установки пакетов за пределами стандартное дерево Go.
Таким образом, GOROOT устанавливает расположение стандартной библиотеки, а GOPATH - для нестандартных библиотек. Одна библиотека не должна находиться в обоих местах сразу.
Ответ 3
Этот каталог может быть где вы $GOROOT
, но вы всегда можете проверить с помощью go env
, и это будет отображать GOROOT
как одну из переменных среды:
$ 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"
Таким образом, ваша установка может иметь его в другом месте, но в любом случае вы не можете сделать один и тот же путь для GOROOT
и GOPATH
, причина в том, что ваш GOPATH
также имеет папку src
, в котором находится стандартная библиотека:
@ /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
Причина, по которой вы не можете иметь их в одном месте, заключается в том, что при запуске go install
он будет выглядеть как в GOROOT
, так и в GOPATH
, и он увидит, что все ваши импортные как fmt
и os
присутствуют как в GOROOT
, так и в GOPATH
, и, следовательно, компилятор плохого выхода будет запутан и начнет кричать на вас (что было в вашем случае).
Ответ 4
Добавьте следующие строки в ваш файл .bashrc
:
export GOPATH=/home/user/workspace
export GOROOT=/home/user/go
export PATH=$GOPATH/bin:$PATH
Затем загрузите bashrc: $ source.bashrc
Ответ 5
Добавьте ниже три строки в вашем файле ~/.bashrc
.
export GOROOT="$HOME/go" # extracted tar.gz go
export GOPATH="$HOME/go/bin"
export PATH="$GOPATH:$PATH"
Другими словами, $GOROOT/bin
является $GOPATH