无法导入Golang中的本地模块

lmvvr0a8  于 2023-01-15  发布在  Go
关注(0)|答案(5)|浏览(199)

我正在尝试导入本地模块,但无法使用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中的警告,尽管我已经在~/.bashrc文件中设置了GO111MODULE=on

brgchamk

brgchamk1#

阅读:Ian Lance Taylor的评论(围棋核心团队)

我知道有三种方法:

*方法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

在Ch 2-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

1.方法3(非常快速的黑客方式为不耐烦):
1.关闭Go模块GO111MODULE=off
1.删除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

原因:在构建期间,编译器首先查找供应商,然后查找GOPATH,然后查找GOROOT。因此,由于符号链接,VSCode的go相关工具也将正常工作,因为它依赖于GOPATH(它们在GOPATH之外不工作)

9rygscc1

9rygscc12#

具体步骤如下:

on main folder - go mod init
2.go mod tidy
3.go to the folder where main file is present
4.install the package via 
    go get <package name>
5.go build

在执行上述步骤之前,您的项目路径应为

project path = GOPATH/src/<project_name>

沿着,还应有2个与src文件夹平行的文件夹

  • 源代码
  • Package

当你安装任何软件包,它应该是去里面的pkg文件夹,并在做了去国防部整洁,应该有一个文件生成

  • go.mod
  • 列表项
njthzxwz

njthzxwz3#

go mod tidy单独在根文件夹为我做的

zwghvu4y

zwghvu4y4#

如果要导入本地模块,则需要Map模块路径,以便它可以在本地文件系统中找到代码。
首先使用gomodedit命令将模块的任何导入替换为本地文件

$ go mod edit -replace example.com/greetings=../greetings

该命令指定example.com/greetings应替换为../greetings,以便查找依赖项。运行该命令后,当前目录中的go.mod文件应在其mod文件中包含replace指令
之后,使用gomodtidy命令同步依赖项,添加那些已导入但当前模块尚未跟踪的代码所需的依赖项

$ go mod tidy

引用自official documentation

ftf50wuq

ftf50wuq5#

我发现包声明的值必须与文件夹的名称相匹配,否则导入将失败。这是一个低级错误,但我希望它能帮助那些犯了和我一样错误的人。

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

在我的示例中,我在hello.go中声明的包值是hello,而不是handlers,这导致了我的导入失败。

相关问题