GOBIN не встановлено: не вдається запустити go install


86

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

go install custom.go

Я отримав цю помилку

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

Як встановити GOBIN?


16
BTW: Це абсолютно неправильний спосіб встановити пакет. Це ніколи не спрацює. go installвстановлює пакети, а не окремі файли. Будь ласка, прочитайте всю сторінку golang.org/cmd/go і дізнайтеся, як налаштувати файли.
Volker

спасибі за голови!
user3918985

2
Я думаю, ви шукаєте go build.
bunnybare

2
Я не впевнений, що погоджуюсь, що це абсолютно неправильно. Коли встановлено GOBIN, існує дві різні поведінки: При використанні go build <gofile.go> виконуваний файл створюється в тій же папці. При використанні go install <gofile.go> виконуваний файл створюється в GOBIN.
Ерез А. Корн,

2
FWIW - стандартні документи для початку рекомендують робити саме це. golang.org/doc/install
Mike Buckbee

Відповіді:


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Каталог містить скомпільовані команди.
Кожна команда називається своїм вихідним каталогом, але лише кінцевим елементом, а не всім шляхом. Тобто, команда з джерелом in 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): ви хочете встановити пакет, а не один файл.


ти маєш на увазі це? Я повторив $ 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

Я встановив шлях GOBIN, і це спрацювало для мене

export GOBIN=[WorkspacePath]/bin

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
це справжнє рішення IMO. go installпрацює в каталогах, і якщо ви вказали певний файл go, то це може спричинити саме цю проблему.
senseiwu

13

Насправді існує 2 різних типи поведінки.

go install <package>

це задокументовано у компіляції та встановленні пакетів та залежностей. Вам не потрібен GOBIN, якщо ви правильно встановили GOPATH.

go install <gofile>

це не задокументовано, і вам потрібна змінна GOBIN env у цьому режимі.


1
go install <gofile>задокументована, в go help packagesякій go install --helpпосилається на. Проблема полягає в тому, що go install(в 1.9.2 і раніше) має непослідовну поведінку, в одному випадку це вимагає, а в іншому не вимагає явного встановлення GOBIN.
Stevo Slavić

7

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

Будь ласка, перевірте свої змінні середовища go, запустивши $ go env | grep -i "^ GO" та зверніть увагу на GOROOT та GOPATH, щоб перевірити, чи вказує GOROOT на вашу вихідну установку GO, а GOPATH - на вашу робочу область.

Якщо все правильно, перейдіть до піддиректорії, де знаходиться вашpkg.go, а потім запустіть $ go build (без імені файлу) спочатку і $ go install (знову з назвою нашого файлу) по-друге, якщо на екрані не відображається повідомлення про помилку, пакет готовий у вашій робочій області / pkg / youros /../ yourpackage.a


7

У вікнах із 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

Налаштування GOBIN

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. ви можете знайти перевірку для скомпільованого двійкового файлу (<ваш_модуль>) у папці bin

0

Вам не потрібно $ GOBIN, якщо ви правильно встановили $ GOPATH . Якщо так, просто перевірте, чи ваш проект знаходиться в папці $ GOPATH / src .


0

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

GOBIN Каталог, де "go install" встановить команду.

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

Якщо встановлено змінну середовища GOBIN, команди встановлюються в каталог, який вона називає, замість DIR / bin. GOBIN повинен бути абсолютним шляхом.

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

У режимі, що розуміє модулі, GOPATH більше не визначає значення імпорту під час побудови, але все одно зберігає завантажені залежності (у GOPATH / pkg / mod) та встановлені команди (у GOPATH / bin, якщо не встановлено GOBIN).

Отже, здається, в основному ви можете використовувати GOBIN, щоб тимчасово або назавжди замінити двійкове місце встановлення за замовчуванням (тобто $GOPATH/bin). Мені вдалося встановити 1-файл go "скрипт" за допомогою env GOBIN=$HOME/bin/ go install testfile.go. Це було зроблено за допомогою go v1.11.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.