Несмотря на то, что я GOPATH
правильно настроил, я все еще не могу получить команду «go build» или «go run», чтобы найти свои собственные пакеты. Что я делаю не так?
$ echo $GOROOT
/usr/local/go
$ echo $GOPATH
/home/mitchell/go
$ cat ~/main.go
package main
import "foobar"
func main() { }
$ cat /home/mitchell/go/src/foobar.go
package foobar
$ go build main.go
main.go:3:8: import "foobar": cannot find package
$ go help gopath
Ответы:
Это не работает, потому что ваш
foobar.go
исходный файл не находится в каталоге с именемfoobar
.go build
иgo install
попробуйте сопоставить каталоги, а не исходные файлы.$GOPATH
действительный каталог, напримерexport GOPATH="$HOME/go"
foobar.go
в$GOPATH/src/foobar/foobar.go
и здание должно работать нормально.Дополнительные рекомендуемые действия:
$GOPATH/bin
к себе$PATH
:PATH="$GOPATH/bin:$PATH"
main.go
в подпапку$GOPATH/src
, например$GOPATH/src/test
go install test
теперь должен создать исполняемый файл,$GOPATH/bin
который можно вызвать, набравtest
в терминале.источник
GOPATH=/usr/local/go-pkgs
, так что Гоу ищет/usr/local/go-pkgs/src/<package-name>
источник, ноgo get
вставляет его/usr/local/go-pkgs/src/gopkg.in/<package-name>
. Почему мне нужно вручную перемещать все мои пакеты после установки? Это просто глупо.go get
обычно помещает пакеты в,$GOPATH/src/
поэтому, если вы вызовете,go get domain.com/path/to/package
он окажется в$GOPATH/src/domain.com/path/to/package
. Думаю, вы пытаетесь получить посылкуgopkg.in
? Если это так, это абсолютно запланированное поведение, и вам следует просто импортировать их с их полным именем; например,import "gopkg.in/yaml.v1"
как также описано в документации .Edit: так как вы имели в виду GOPATH см fasmat «сек ответ (upvoted)
Как упоминалось в разделе « Как мне найти мой пакет? », Вам необходимо поместить пакет
xxx
в каталогxxx
.См. Спецификацию языка Go :
Организация Code упоминает:
("рабочая область" - это запись пути в вашем
GOPATH
: эта переменная может ссылаться на несколько путей для вашего 'src, bin, pkg
')(Оригинальный ответ)
Вы также должны установить
GOPATH
~ / go, notGOROOT
, как показано в разделе « Как писать код Go ».Это отличается от
GOROOT
:источник
TL; DR: соблюдайте соглашения Go! (урок усвоен на собственном горьком опыте), проверьте старые версии go и удалите их. Установите последнюю версию.
Для меня решение было другим. Я работал на общем сервере Linux, и после проверки моих
GOPATH
и других переменных среды несколько раз он все еще не работал. Я обнаружил несколько ошибок, включая «Не удается найти пакет» и «Неизвестный путь импорта». После попытки переустановки с помощью этого решения по инструкциям на golang.org (включая часть удаления ) все еще возникли проблемы.Потребовалось некоторое время , чтобы понять , что есть еще старая версия , которая не была удалена (работает
go version
затемwhich go
снова ... DAHH) , который заставил меня этим вопросом и , наконец , решена.источник
Хотя принятый ответ по-прежнему верен в отношении необходимости сопоставления каталогов с именами пакетов, вам действительно нужно перейти на использование модулей Go вместо использования GOPATH. Новые пользователи, столкнувшиеся с этой проблемой, могут быть сбиты с толку упоминаниями об использовании GOPATH (как и я), которые сейчас устарели. Итак, я постараюсь прояснить эту проблему и дать рекомендации, связанные с предотвращением этой проблемы при использовании модулей Go.
Если вы уже знакомы с модулями Go и столкнулись с этой проблемой, перейдите к моим более конкретным разделам ниже, в которых рассматриваются некоторые соглашения Go, которые легко упустить из виду или забыть.
В этом руководстве рассказывается о модулях Go: https://golang.org/doc/code.html
Организация проекта с помощью модулей Go
После перехода на модули Go, как упоминалось в этой статье, организуйте код проекта, как описано:
Вы можете инициализировать свой модуль следующим образом:
Ваш код не обязательно должен находиться на github.com для его сборки. Однако лучше всего структурировать модули так, как будто они будут опубликованы.
Понимание того, что происходит при попытке получить посылку
Здесь есть отличная статья, в которой рассказывается о том, что происходит, когда вы пытаетесь получить пакет или модуль: https://medium.com/rungo/anatomy-of-modules-in-go-c8274d215c16 В нем обсуждается, где пакет хранится и будет поможет вам понять, почему вы можете получить эту ошибку, если вы уже используете модули Go.
Убедитесь, что импортированная функция была экспортирована
Обратите внимание: если у вас возникли проблемы с доступом к функции из другого файла, вам необходимо убедиться, что вы экспортировали свою функцию. Как описано в первой предоставленной мной ссылке, функция должна начинаться с заглавной буквы, чтобы ее можно было экспортировать и сделать доступной для импорта в другие пакеты.
Имена каталогов
Еще одна важная деталь (как упоминалось в принятом ответе) заключается в том, что имена каталогов определяют имена ваших пакетов. (Имена ваших пакетов должны совпадать с именами их каталогов.) Вы можете увидеть примеры этого здесь: https://medium.com/rungo/everything-you-need-to-know-about-packages-in-go-b8bac62b74cc With при этом файл, содержащий ваш
main
метод (т. е. точку входа вашего приложения), вроде как освобожден от этого требования.Например, у меня были проблемы с импортом при использовании такой структуры:
Мне не удалось импортировать код в
utils
свойmain
пакет.Однако, как только я поместил
main.go
в отдельный подкаталог, как показано ниже, мой импорт работал нормально:В этом примере мой файл go.mod выглядит так:
Когда я сохранил main.go после добавления ссылки на
utils.MyFunction()
, моя IDE автоматически вставила ссылку на мой пакет следующим образом:(Я использую VS Code с расширением Golang.)
Обратите внимание, что путь импорта включает подкаталог пакета.
Работа с частным репо
Если код является частью частного репо, вам необходимо запустить команду git, чтобы разрешить доступ. В противном случае вы можете столкнуться с другими ошибками. В этой статье упоминается, как это сделать для частных репозиториев Github, BitBucket и GitLab: https://medium.com/cloud-native-the-gathering/go-modules-with-private-git- repositories-dfe795068db4 Эта проблема также обсуждается здесь: Как правильно «получить» частный репозиторий?
источник
Вы пробовали добавить абсолютный каталог перехода к своему «пути»?
источник