Golang ищет пакеты в GOROOT вместо GOPATH

#go

#Вперед

Вопрос:

Я пытаюсь запустить простую программу Go со следующей настройкой:

 // main.go

package main

import (
    "fmt"
    "db"
    "webapp"
)

func main() {
    database := db.New()
    webapp.StartServer(amp;database, amp;notifierClient)
}

 

Я получаю следующие ошибки импорта:

 main.go:8:2: package db is not in GOROOT (C:Program FilesGosrcdb)
main.go:9:2: package webapp is not in GOROOT (C:Program FilesGosrcwebapp)
 

Структура папок, которая у меня есть, такова:

 C:UsersUserDocumentsGolangsrcMyProjectsource
    main.go
    go.mod
    go.sum
    db/     several .go files
    webapp/ several .go files
 

Я запустил go mod init , и мой GOPATH установлен на C:UsersUserDocumentsGolang , но он продолжает искать локальные модули импорта внутри GOROOT .

Где я ошибаюсь?

Комментарии:

1. Я бы рекомендовал использовать go mod. go mod init somegit.com/someuser/somemodule и затем go mod tidy .

Ответ №1:

Вам нужно добавить имя вашего модуля, например myapp , перед путем импорта:

 import (
    "myapp/db"
    "myapp/webapp"
)
 

Организация кода:

Путь импорта — это строка, используемая для импорта пакета. Путь импорта пакета — это путь к его модулю, объединенный с его подкаталогом внутри модуля. Например, модуль github.com/google/go-cmp содержит пакет в каталоге cmp/. Путь импорта этого пакета github.com/google/go-cmp/cmp . Пакеты в стандартной библиотеке не имеют префикса пути к модулю.


Новые изменения модуля в Go 1.16:

Модули включены по умолчанию Команда go теперь по умолчанию создает пакеты в режиме с поддержкой модулей, даже если go.mod отсутствует. Это большой шаг к использованию модулей во всех проектах.

По-прежнему возможно создавать пакеты в режиме GOPATH, установив для переменной среды GO111MODULE значение off . Вы также можете установить для GO111MODULE значение auto, чтобы включить режим с поддержкой модуля, только если файл go.mod присутствует в текущем каталоге или любом родительском каталоге. Ранее это было по умолчанию. Обратите внимание, что вы можете установить GO111MODULE и другие переменные постоянно с помощью go env -w:

go env -w GO111MODULE=auto Мы планируем отказаться от поддержки режима GOPATH в Go 1.17. Другими словами, Go 1.17 будет игнорировать GO111MODULE. Если у вас есть проекты, которые не строятся в режиме с поддержкой модулей, сейчас самое время выполнить миграцию. Если есть проблема, препятствующая вашему переходу, пожалуйста, рассмотрите возможность подачи заявления о проблеме или отчета об опыте.


Для ясности — моя тестовая структура такова:

  go version
go version go1.17.5 linux/amd64

 

введите описание изображения здесь

Просто рабочий пример ( main.go файл):

 package main

import (
    "myapp/db"
    "myapp/webapp"
)

func main() {
    database := db.New()
    webapp.StartServer(amp;database, amp;notifierClient)
}

var notifierClient = "Test"
 

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Отладочный вывод:

введите описание изображения здесь

Комментарии:

1. Спасибо! это сработало. Мне также пришлось отключить модули, чтобы он начал искать в GOPATH: go env -w GO111MODULE=on, а затем снова = off

2. Пожалуйста, мой env таков: GO111MODULE="" и вам не нужно работать внутри $ GOPTH