# #go #ubuntu #visual-studio-code #gopath
Вопрос:
Я новичок в GO и застрял в конфигурации среды на несколько часов.
Мне удалось запустить несколько тестовых проектов, но когда я попытался импортировать свои пользовательские локальные пакеты (скажем, xxx), команда «перейти к запуску» не удалась, зарегистрировав это:
*test/main/main.go:6:2: package test/xxx is not in GOROOT (/usr/local/go/src/test/xxx)*
Странно, что GOPATH, похоже, игнорируется при импорте локальных пакетов на мой компьютер ubuntu.
версия go-go1.16.5 linux/amd64
GOPATH устанавливается с помощью export GOPATH=»$HOME/GoProjects»
GOROOT устанавливается с помощью export GOPATH=»/usr/local/go»
GoMod «включен» с помощью go env -w GO111МОДУЛЬ=включен
После редактирования файлов .go проекта в корневой папке проекта ($GOPATH/src/test) вводятся команды «go mod init» и «go mod tidy», и структура файла проекта выглядит следующим образом:
/src
/.vscode
-launch.json
/gitbub.com
/test
/main
-main.go (here: import "test/xxx")
/xxx
-xxx.go (here: package xxx)
-go.mod (almost empty - line 1: module test
line 2:
line 3: go 1.16 )
Что мне следует сделать, чтобы решить эту проблему?
Комментарии:
1. Печально, но ничего не изменилось.
2. Предполагая (не ясно из вашего поста), что все это дерево находится под вашими проектами $HOME/G. При использовании модулей вы не хотите помещать свой проект или его зависимости в GOPATH. Смешивание их приводит только к проблемам.
3. Независимо от деталей функций, другой разницы, по-видимому, нет. Ваш метод вдохновляет, и я только что попробовал свои коды в своей системе WIN10, и коды увенчались успехом. Теперь мы можем сказать, что проблема должна заключаться в некоторых конфигурациях или командах.
4. Не называйте модуль
test
. Некоторые имена зарезервированы. Особенно все имена без точки. Назовите свой модульmy.test.naming-is-hard
.
Ответ №1:
Предполагая (не ясно из вашего поста), что все это дерево находится под вашим $HOME/GoProjects
. При использовании модулей; не помещайте свой проект внутрь GOPATH, так как смешивание как GOPATH, так и модулей приводит только к проблемам.
Во-первых, установите $GOPATH
что-то вроде $HOME/go
того, что вы можете использовать для go get
различных инструментов, которые вы хотите использовать в разных проектах (например dlv
, отладчик и т. Д.), Но не помещайте туда свои проекты.
При запуске нового проекта поместите его снаружи $GOPATH
$HOME/GoProjects/test
(вы можете сохранить макет проекта, который у вас есть, src
но вам это не нужно src
):
GoProjects
/test
/main
-main.go
/xxx
-xxx.go
В каталоге проекта (здесь test
) запустите go mod init NAME
, где ИМЯ-это имя вашего модуля. Не используйте test
только полное имя, которое будет определять пространство имен вашего проекта в вашем «домене» (например github.com/yourusername/test
). Это имя затем будет использоваться при импорте пакетов из вашего модуля. Таким образом, в main.go
вас будет импортирован xxx
пакет (должен быть package xxx
), подобный этому:
import "github.com/yourusername/test/xxx"
Смотрите более подробную информацию о модулях здесь: https://blog.golang.org/using-go-modules
Ответ №2:
Во-первых, перестань беспокоиться GOPATH
. Это старые вещи, и вам больше не нужно этим заниматься. Затем создайте где-нибудь папку test
(с ней не нужно ничего делать GOPATH
, просто поместите в текущий каталог или куда хотите). Тогда сделай test/xxx
. Затем сделайте test/xxx/xxx.go
:
package xxx
const X = 1
Затем создайте папку test/main
. Затем сделайте test/main/main.go
:
package main
import "test/xxx"
func main() {
println(xxx.X)
}
Затем вернитесь test
и сделайте go mod init test
это . Затем вернитесь test/main
и сделайте go build
это . Выполнено.