Go install завершается с ошибкой: нет места установки для каталога xxx за пределами GOPATH

152
~/src/go-statsd-client> echo $GOPATH
/Users/me/gopath
~/src/go-statsd-client> echo $GOROOT
/usr/local/Cellar/go/1.1.1\
~/src/go-statsd-client> go install
go install: no install location for directory /Users/me/src/go-statsd-client outside GOPATH

Независимо от того, в какой структуре находится проект, всегда происходит одно и то же сообщение. Go build работает отлично.

Вот мой go env

GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/me/gopath"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.1.1"
GOTOOLDIR="/usr/local/Cellar/go/1.1.1/pkg/tool/darwin_amd64"
CC="gcc"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-common"
CGO_ENABLED="1"

Это на Mac OSX Mountain Lion и Go был установлен вместе с доморощенным.

tgandrews
источник

Ответы:

116

Если вы не укажете аргументы, по go installумолчанию будет предпринята попытка установить пакет в текущем каталоге. Сообщение об ошибке говорит вам, что он не может этого сделать, потому что текущий каталог не является частью вашего $GOPATH.

Вы также можете:

  • Определите $GOPATHваш $ HOME ( export GOPATH=$HOME).
  • Переместите ваш источник в пределах current $GOPATH( mv ~/src/go-statsd-client /User/me/gopath).

После того, как вы войдете в go-statsd-clientкаталог и наберете текст, go installбудет работать, как и в go install go-statsd-clientлюбом месте файловой системы. Встроенные двоичные файлы войдут в $GOPATH/bin.

В качестве несвязанного предложения вы, вероятно, захотите присвоить пространству имен свой пакет доменным именем, чтобы избежать конфликта имен (например github.com/you/go-statsd-client, если именно там вы храните свой исходный код).

Густаво Нимейер
источник
5
В моем случае эта ошибка была вызвана отсутствием $GOPATH/binкаталога. Создание этой папки было необходимым - мне не нужно было устанавливать GOBINenv var.
xentek
4
@RobertReiz, хотя я разделяю ваше разочарование, я должен отметить, что большинство других языков действительно используют их, но, возможно, они не так заметны. Например, Python (язык, известный своей простотой) имеет PYTHONHOMEвместо GOROOTи PYTHONPATHвместо GOPATH. Даже (ГХ) С имеет LIBRARY_PATH, C_INCLUDE_PATHи т.д.
Hut8
1
Я получаю эту ошибку после того, как export GOPATH=$PWD(стоящий в корне дерева клонов Голанга) ваш ответ не может объяснить ошибку в этом случае.
ulidtko
2
Для меня положить его в $ GOPATH было недостаточно. Это должно было быть в каталоге в $ GOPATH / src /
Томас
9
Я уверен, что есть несколько очень веских причин, чтобы оправдать существование GOPATH, но со стороны это кажется совершенно бессмысленным. Почему я должен мутировать глобальные переменные среды только для того, чтобы создать пакет локально Alexander
Александр - Восстановить Монику
193

Для любых пользователей OS X и будущих пользователей вы также должны установить, GOBINчтобы избежать этого запутанного сообщения об установке иgo get

mkdir bin 
export GOBIN=$GOPATH/bin
Бенджамин Вуттон
источник
4
Вам не нужно устанавливатьGOBIN . Если настройка $GOPATH/binимеет значение, значит что-то не так с вашей настройкой, или вы делаете что-то, что не должны делать.
Дэйв С
29
@DaveC У меня тоже такая же проблема на OS X. Установка GOBIN исправила это.
nJoshi
2
Огромное спасибо, похоже, что с официальным пакетом OS X что-то не так, и вам действительно нужно установить GOBIN, все еще действителен для 10.11.4 (Эль-Капитан)
Джонас Д.
3
Это корректное исправление и для Ubuntu 16.04, с бинарным пакетом от http://golang.org/dl/
suside
1
Это прекрасно работает на MaOS Sierra 10.12.3 Спасибо!
Грег Хилстон
30

Вы используете go install в каталоге вне папки GOPATH. Установите переменную GOBIN env или переместите папку src в GOPATH.

GOPATH/
     bin/
     src/
       go-statsd-client/

Дополнительная информация: GO BUILD Исходный код , строка 296

Андреа Ди Персио
источник
Я попробовал предложенное выше предложение (export GOPATH = $ HOME), затем переместился в мою соответствующую директорию (где я пишу свой код) и набрал go install ... тот же результат, go install: нет места установки для каталога ....
stian
Строка 296 - это просто возврат?
Феликс Рабе
1
Я забыл установить свой GOBIN env
cevaris
Я пошел на это решение.
Михамина Ракотомандимбю
19

Вам нужно настроить оба GOPATHи GOBIN. Убедитесь, что вы сделали следующее (пожалуйста, замените его ~/goна предпочитаемое, GOPATHа затем измените GOBIN). Это проверено на Ubuntu 16.04 LTS.

export GOPATH=~/go 

mkdir ~/go/bin

export GOBIN=$GOPATH/bin

Выбранный ответ не решил проблему для меня.

Женхуа
источник
Я определил оба в 16.04, и это не сработало для меня.
Catskul
5

Вам нужно иметь 3 каталога внутри выбранного вами каталога GOPATH.

GOPATH
     /bin
     /src
       /someProgram
        program.go
       /someLibrary
        library.go
     /pkg

Затем вы запустите go installизнутри someProgram (который помещает исполняемый файл в bin) или someLibrary (который помещает библиотеку в pkg).

Эрл Зедд
источник
1
Это сработало для меня после поиска в Интернете 2 часа.
Вишалкнишад
3

У меня была эта проблема на Windows.

Моя проблема заключалась в том, что моя %GOPATH%переменная окружения была установлена ​​на

C:\Users\john\src\goworkspace

вместо того

C:\Users\john\src\goworkspace\

Добавление пропущенной косой черты в конце исправило это для меня.

eckza
источник
1
Святая корова, ты только что спас меня от потенциально многочасовой головной боли. Я на Ubuntu, но у меня была такая же проблема. Очень внимательно относился к именам папок, структуре папок, предварительным настройкам с src / github.com / xyabz / и всем, кроме установки, продолжал давать мне ошибки.
anon58192932
3

Для чего это стоит, вот мой .bash_profile, который хорошо работает для меня на Mac с Atom, после установки идти с Homebrew:

export GOROOT=`go env GOROOT`
export GOPATH=/Users/yy/Projects/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
JRun
источник
2

В моем случае (OS X) это было потому , что я поставил GOPATHна /home/username/go(как в книге) вместо/Users/username/go

catamphetamine
источник
2

Я на Windows, и я получил его, дав команду go help gopathcmd, и прочитал жирный текст в инструкции,

то есть , если код wnat установки находится ..BaseDir...\SomeProject\src\basic\set, то GOPATH не должен быть таким же адресом как код, он должен быть только Base Project DIR: ..BaseDir...\SomeProject.

Переменная окружения GOPATH перечисляет места для поиска кода Go. В Unix значение представляет собой строку, разделенную двоеточиями. В Windows значение представляет собой строку, разделенную точкой с запятой. На плане 9 значение представляет собой список.

Если переменная среды не установлена, GOPATH по умолчанию использует подкаталог с именем «go» в домашнем каталоге пользователя ($ HOME / go в Unix,% USERPROFILE% \ go в Windows), если только этот каталог не содержит дистрибутив Go. Запустите "go env GOPATH", чтобы увидеть текущую GOPATH.

Смотрите https://golang.org/wiki/SettingGOPATH, чтобы установить пользовательскую GOPATH.

Каждый каталог, указанный в GOPATH, должен иметь предписанную структуру:

Каталог src содержит исходный код. Путь под src определяет путь импорта или имя исполняемого файла.

В каталоге pkg хранятся установленные объекты пакета. Как и в дереве Go, каждая целевая пара операционной системы и архитектуры имеет свой собственный подкаталог pkg (pkg / GOOS_GOARCH).

Если DIR является каталогом, указанным в GOPATH, пакет с источником в DIR / src / foo / bar может быть импортирован как «foo / bar», а его скомпилированная форма установлена ​​в «DIR / pkg / GOOS_GOARCH / foo / bar.a». ».

Каталог bin содержит скомпилированные команды. Каждая команда названа для своего исходного каталога, но только конечный элемент, а не весь путь. То есть команда с источником в DIR / src / foo / quux устанавливается в DIR / bin / quux, а не в DIR / bin / foo / quux. Префикс "foo /" удаляется, так что вы можете добавить DIR / bin в PATH, чтобы получить доступ к установленным командам. Если установлена ​​переменная среды GOBIN, команды устанавливаются в каталог, который она называет, вместо DIR / bin. Гобин должен быть абсолютный путь.

Вот пример макета каталога:

GOPATH=/home/user/go

/home/user/go/
    src/
        foo/
            bar/               (go code in package bar)
                x.go
            quux/              (go code in package main)
                y.go
    bin/
        quux                   (installed command)
    pkg/
        linux_amd64/
            foo/
                bar.a          (installed package object)

..........

Если GOPATH был установлен на Base Project DIR и все еще имеет эту проблему, в Windows вы можете попытаться установить GOBIN как Base Project DIR\binили %GOPATH%\bin.

ю ян цзянь
источник
1

Осторожнее при беге

export GOPATH=$HOME

Предположим, что ваш код существует в определенных местах, связанных с GOPATH. Так что вместо этого вы можете использовать docker для запуска любой команды go:

docker run -it -v $(pwd):/go/src/github.com/<organization name>/<repository name> golang

И теперь вы можете использовать любую команду golang, например:

go test github.com/<organization name>/<repository name> 
Омер Леви Хеврони
источник
0

В windows мое окно cmd уже было открыто, когда я установил переменную среды GOPATH. Сначала мне пришлось закрыть cmd, а затем снова открыть, чтобы он вступил в силу.

залежь
источник
0

Проблема в том, что вы находитесь не в каталоге пакета, в котором есть файл go с функцией go main, и go install не может найти команду (файл go с функцией go main), которую вы хотите установить.

$ cd /path/to/file-with-main-function.go

и затем запустите:

$ go install 
Маргач Крис
источник
-1

На OSX Мохаве 10.14, goкак правило , установлен на /usr/local/go.

Следовательно, настройте эти ENV, и вы должны быть готовы к работе.

export GOPATH=/usr/local/go && export GOBIN=/usr/local/go/bin

Кроме того, добавьте их к себе bash_profileили, zsh_profileесли это работает.

echo "export GOPATH=/usr/local/go && export GOBIN=/usr/local/go/bin" >> ~/.bash_profile && source ~/.bash_profile

Нулевой указатель
источник