ГОБИН не установлен: не удается запустить, иди, установи

86

Я пытаюсь установить собственный пакет для файла main.go. Однако когда я побежал

go install custom.go

Я получил эту ошибку

go install: no install location for .go files listed on command line (GOBIN not set)

Как установить ГОБИН?

user3918985
источник
16
Кстати: это совершенно неправильный способ установки пакета. Это никогда не сработает. go installустанавливает пакеты, а не отдельные файлы. Прочтите все на golang.org/cmd/go и узнайте, как настроить файлы.
Volker
спасибо за внимание!
user3918985 09
2
Я думаю, вы ищете иди сборку.
bunnybare
2
Я не уверен, что согласен с тем, что это совершенно неправильно. Когда установлен GOBIN, существует два различных поведения: при использовании go build <gofile.go> исполняемый файл создается в той же папке. При использовании go install <gofile.go> исполняемый файл создается в GOBIN.
Эрез А. Корн
2
FWIW - стандартная документация для начала работы рекомендует сделать именно это. golang.org/doc/install
Майк Бакби

Ответы:

46

Обновление 2020: с 1.11 Go и внедрение модулей Go , GOPATHбольше не требуется для каждого проекта, и по умолчанию~/go для глобальных инструментов / проекта вы бы go get.

Go 1.16 (Q1 2020) по умолчанию должен GOBINбыть GOPATH[0]/bin .

Но пока для любого проекта, использующего модули, у вас больше не будет сообщения об ошибке типа « go install: no install location ...».


Оригинальный ответ 2014 г .:

Проверьте свою GOPATHпеременную.
Удостовериться:

  • ваши источники находятся под GOPATH/src
  • у вас есть binпапка в папке GOPATH.

См. Переменную среды GOPATH (где DIR - это GOPATHпапка):

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

Если GOBINзадана переменная среды, команды устанавливаются в каталог, который она называет, а не в DIR/bin. GOBINдолжен быть абсолютный путь.


Например, в этом потоке показано, что происходит в случае, когда сборка go выполняется вне GOPATH/src:

Похоже, у вас GOPATHустановлено значение, ~/goно вы выполнили go installкоманду на~/dev/go

Смотрите Go Build

Путь Go - это список деревьев каталогов, содержащих исходный код Go. С ним обращаются для разрешения импорта, который не может быть найден в стандартном дереве Go.

Если вы это сделали go build, вы также можете попробовать go install(нет custom.go): вы хотите установить пакет, а не отдельный файл.

VonC
источник
ты имеешь ввиду это? Я повторил $ ​​PATH и получил следующее: / Users / apple / bin: / usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / local / git / bin: / usr / local / go / bin: / usr / local / mysql / bin
user3918985,
76

Я установил путь ГОБИНА, и это сработало для меня

export GOBIN=[WorkspacePath]/bin
Pratik Goenka
источник
2
да, это правильный ответ. просто создайте / bin в этом GOPATH
swdev
7
После пути экспорта я получил ошибку cannot install, GOBIN must be an absolute path:(
lee
@lee Вы использовали ..или ~по указанному вами пути? Я получил эту ошибку и просто переключился на абсолютный путь, такой как /home/ben/bin/или даже $HOME/bin/. Моя полная команда была (в Fishshell, go v1.11) env GOBIN=$HOME/bin/ go install testfile.go.
Бенни Джобиган
40

Как новичок, я столкнулся с этой ошибкой, когда пробовал различные команды go (сборка, запуск и установка). Короче говоря, вы не можете пойти установить на filename.go . Вы можете установить только пакет.

Это сбивало с толку, потому что я узнал, что:

nate:~/work/src/dir $ go run hello/hello.go
hello, world.

работает отлично. Но я не мог понять, почему установка не работает:

nate:~/work/src/dir $ go install hello/hello.go 
go install: no install location for .go files listed on command line (GOBIN not set)
nate:~/work/src/dir $ go install hello
can't load package: package hello: cannot find package "hello" in any of:
    /opt/go/src/hello (from $GOROOT)
    /home/ubuntu/work/src/hello (from $GOPATH)

Независимо от того, в каком каталоге я был:

nate:~/work/src/dir $ cd hello
nate:~/work/src/dir/hello $ go install hello.go 
go install: no install location for .go files listed on command line (GOBIN not set)
nate:~/work/src/dir/hello $ go install hello
can't load package: package hello: cannot find package "hello" in any of:
    /opt/go/src/hello (from $GOROOT)
    /home/ubuntu/work/src/hello (from $GOPATH)

Эта путаница вызвана тем, что go run работает только с исходными файлами Go (имена файлов заканчиваются на .go), а go install принимает только пакеты. Пакеты именуются по пути импорта или пути в файловой системе. Таким образом:

nate:~/work/src/dir $ go install dir/hello
nate:~/work/src/dir $ go install ./hello/
nate:~/work/src/dir/hello $ go install .

все отлично работают. Первый относится к пакету по пути импорта (при условии, что $ GOPATH = "/ home / nate / work", инструменты go ищут исходный код в / home / nate / work / src), остальные интерпретируются как файловая система пути из-за ведущих периодов.

См. Также документы GOPATH .

Нейт Грин
источник
1
это реальное решение ИМО. go installработает с каталогами, и если вы укажете конкретный файл go, он может вызвать эту конкретную проблему.
сэнсэйу
13

На самом деле есть 2 разных типа поведения.

go install <package>

это задокументировано в Компиляция и установка пакетов и зависимостей. Вам не нужен GOBIN, если вы правильно установили GOPATH.

go install <gofile>

это не задокументировано, и в этом режиме вам понадобится переменная GOBIN env.

PickBoy
источник
1
go install <gofile>задокументировано, в go help packagesкотором go install --helpимеется в виду. Проблема в том, что go install(в 1.9.2 и ранее) ведет себя непоследовательно, в одном случае это требует, а в другом - не требует явного задания GOBIN.
Стево Славич
7

Как указывалось в предыдущих ответах, если ваш GOPATH env правильно настроен для вашей рабочей области, вам не нужно устанавливать переменную GOBIN env.

Проверьте переменные среды go, запустив $ go env | grep -i "^ GO" и обратите внимание на GOROOT и GOPATH, чтобы проверить, указывает ли GOROOT на вашу исходную установку GO, а GOPATH указывает на ваше рабочее пространство.

Если все в порядке, перейдите в подкаталог, в котором находится yourpkg.go, затем сначала запустите $ go build (без имени файла), а затем - $ go install (снова без имени файла), если вы не видите сообщения об ошибке на экране, ваш пакет готов в вашем рабочем пространстве / pkg / youros /../ yourpackage.a

user42754
источник
7

В Windows с cygwin кажется хорошей идеей настроить GOBIN на $ GOPATH / bin.

и не забудьте правильно экранировать разделитель имен файлов Windows:

$ echo $GOROOT
C:\Go\

carl@rainier ~/gocode/src/github.com/user/hello
$ echo $GOPATH
C:\cygwin64\home\carl\gocode

carl@rainier ~/gocode/src/github.com/user/hello
$ echo $GOBIN
C:\cygwin64\home\carl\gocode\bin
Карл Биндинг
источник
5

Для *nixсистемы посмотрите, где goона установлена, выполнив следующую команду:

$ which go

какой вывод скажем:

/usr/local/go/bin/go

затем добавьте следующие записи в ~/.bash_profileили в ~/.zshrc:

export GOROOT=/usr/local/go
export GOPATH=$GOROOT/src //your-go-workspace
export GOBIN=$GOROOT/bin //where go-generate-executable-binaries

PATH=$PATH:$GOPATH:$GOBIN

export PATH

PS: Не забудьте указать источник ~/.bash_profileили ~/.zshrcследующим образом:

$ source ~/.bash_profile
Арпит Аггарвал
источник
4
Вы действительно хотите использовать исполняемые файлы для разработки /usr/local/go/bin?
Дольф
1

Что касается установки GOBINверсии переменной, которая не требует этого и просто полагается на GOPATH:

  1. GOBINтребуется, если у нас нет пакета, т.е. файл находится прямо в GOPATHкаталоге. Это вероятно, когда мы пробуем функции Go в качестве учащихся.

  2. Для типичных проектов Go файлы находятся в каталогах пакетов. Для них этого GOPATHдостаточно.

  3. Другими словами, оба следующих решения будут работать: a. Установить GOBINявно как $ GOPATH / bin [только в учебных целях, можно избежать] b. Создайте подкаталог с именем вашего пакета и переместите в него файлы .go.

  4. Думаю, утилиты Go должны удалить указанную выше ошибку и лучше справиться со сценарием - в зависимости от того, является ли аргумент каталогом или исходным файлом.

пр-пал
источник
1

Для пользователей WINDOWS

Откройте командную строку ( Win+ rзатем введите cmd) или окно PowerShell ( Win+ xзатем введите i).

Настройка GOPATH

ПРИМЕЧАНИЕ: GOPATH не должен совпадать с путем установки Go.

go env -w GOPATH=c:\your-go-work

Подробности по ссылке ниже https://github.com/golang/go/wiki/SettingGOPATH#windows

Настройка ГОБИН

go env -w GOBIN=C:\somewhere\else\bin

Я рекомендую проверить пример кода, предоставленный golang. Это мне очень помогло. https://golang.org/doc/code.html#Command

Генри
источник
1

В Windows:

go env -w GOBIN=C:\Users\yourname\go\bin

Подтвердите с помощью go envкоманды, что GOBIN установлен, затем go installкоманда правильно сохраняет исполняемый файл в каталоге bin.

Фрэнки Вонг
источник
1

У меня тоже была такая же проблема (GOBIN не нужно устанавливать отдельно), убедитесь, что у вас есть следующие

  1. GOPATH установлен (это также автоматически устанавливает GOBIN как $ GOPATH / bin)
  2. GOPATH имеет следующие каталоги bin, pkg, src
  3. custom.go помещается в src / <your_module>
  4. затем беги go install <your_module>
  5. вы можете найти проверку скомпилированного двоичного файла (<your_module>) в папке bin
Манджунатх Бхадраннавар
источник
0

Вам не нужен $ GOBIN, если вы правильно установили $ GOPATH . Если да, просто еще раз проверьте, находится ли ваш проект в папке $ GOPATH / src .

theVoogie
источник
0

Из https://golang.org/cmd/go/#hdr-Environment_variables :

GOBIN Каталог, в который 'go install' будет устанавливать команду.

и https://golang.org/cmd/go/#hdr-GOPATH_environment_variable :

Если задана переменная среды GOBIN, команды устанавливаются в каталог, который он называет, а не в DIR / bin. ГОБИН должен быть абсолютным путем.

и https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more

В режиме с поддержкой модулей GOPATH больше не определяет значение импорта во время сборки, но по-прежнему сохраняет загруженные зависимости (в GOPATH / pkg / mod) и установленные команды (в GOPATH / bin, если GOBIN не установлен).

Итак, похоже, что в основном вы можете использовать GOBIN для временного или постоянного переопределения двоичного места установки по умолчанию (т.е. $GOPATH/bin). Я успешно установил однофайловый "скрипт" с использованием env GOBIN=$HOME/bin/ go install testfile.go. Это было сделано с помощью go v1.11.

Бенни Джобиган
источник
0

Пытаться

export GOROOT=""

export PATH=$PATH:$GOROOT/bin

Тьен Трун
источник