Как решить проблему импорта локального пакета: GOPATH игнорируется, действует только GOROOT

# #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 это . Выполнено.