Не удалось импортировать локальные модули в Golang - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь импортировать локальные модули, но не могу импортировать его, используя go mod. Я изначально построил свой проект, используя go mod int github.com/AP/Ch2-GOMS

Обратите внимание, что моя среда go1.14, и я использую VSCode в качестве редактора.

Это структура моей папки

Ch2-GOMS
│   ├── go.mod
│   ├── handlers
│   │   └── hello.go
│   └── main.go

Мой main.go код:

package main

import (
    "log"
    "net/http"
    "os"

    "github.com/AP/Ch2-GOMS/handlers" // This gives "could not import github.com/AP/Ch2-GOMS/handlers" lint error
)

func main() {

    l := log.New(os.Stdout, "product-api", log.LstdFlags)
    hh := handlers.NewHello(l)

    sm := http.NewServeMux()
    sm.Handle("/", hh)

    http.ListenAndServe(":9090", nil)
} 

Я не вижу автозаполнения для своих локальных модулей, таких как handlers.NewHello .

go build сгенерировано go.mod содержимое:

module github.com/AP/Ch2-GOMS
go 1.14

Я также получаю Вы не находитесь ни в модуле, ни в вашей GOPATH. Пожалуйста, смотрите https://github.com/golang/go/wiki/Modules для получения информации о том, как настроить ваш Go проект. предупреждение в VScode, даже если я установил GO111MODULE=on в моем ~/.bashrc файле

1 Ответ

1 голос
/ 14 марта 2020

Чтение : комментарий Яна Лэнса Тейлора (основная команда Go)

Я знаю три способа:

  • Метод 1 (Лучший способ):
# Inside
# Ch2-GOMS
# │   ├── go.mod
# │   ├── handlers
# │   │   └── hello.go
# │   └── main.go

# In Ch2-GOMS
go mod init github.com/AP/Ch2-GOMS

# In main.go
# Add import "github.com/AP/Ch2-GOMS/handlers"
# But, make sure: 
# handlers/hello.go has a package name "package handlers"

Вы, должно быть, делаете что-то не так, и именно поэтому он не работает.

  • Метод 2 (Хороший путь):
# Inside
# Ch2-GOMS
# │   ├── go.mod
# │   ├── handlers
# │   │   └── hello.go
# │   └── main.go

# Inside the handlers package
cd Ch2-GOMS/handlers
go mod init github.com/AP/Ch2-GOMS/handlers # Generates go.mod
go build # Updates go.mod and go.sum

# Change directory to top-level (Ch2-GOMS)
cd ..
go mod init github.com/AP/Ch2-GOMS # Skip if already done
go build # Must fail for github.com/AP/Ch2-GOMS/handlers
vi go.mod

Внутри Ch2-GOMS / go .mod и добавьте следующую строку:

# Open go.mod for editing and add the below line at the bottom (Not inside require)
replace github.com/AP/Ch2-GOMS/handlers => ./handlers

# replace asks to replace the mentioned package with the path that you mentioned
# so it won't further look packages elsewhere and would look inside that's handlers package located there itself
  • Метод 3 (Очень быстрый способ взлома для нетерпеливых):

    1. Отключение Go Модули GO111MODULE=off
    2. Удалить go.mod файл
# Check: echo $GOPATH

# If $GOPATH is set
mkdir -p $GOPATH/src/github.com/AP/Ch2-GOMS
cd $GOPATH/src/github.com/AP/Ch2-GOMS


# If $GOPATH is unset
mkdir -p ~/go/src/github.com/AP/Ch2-GOMS
cd ~/go/src/github.com/AP/Ch2-GOMS

# Now create a symbolic link
ln -s <full path to your package> handlers

Причина : во время сборки компилятор сначала ищет поставщика, затем ГОПАТ, затем GOROOT. Таким образом, благодаря символической ссылке, связанные с VSCode go инструменты также будут работать правильно благодаря предоставленной символической ссылке, так как она использует GOPATH (они не работают вне GOPATH)

...