Cannot load xxx: cannot find module providing package xxx

Stephanie
  • 354

额外说明:下面所给出的答案,虽有未采纳.但其内容或者思路值得借鉴.

环境说明

IDE:VSCode Version:1.36.1

GO Version : go1.12.3 darwin/amd64

GOPATH: /Users/xxx/go:/Users/xxx/Desktop/xxx

本Demo所在目录:/Users/xxx/Desktop/redis-go;没有在GOPATH中,没有设置GO111MODULE

Demo 中使用了go mudule,所以在 workspace setting中把 go.inferGopath 设置为 false

代码组织

---src
   ---hosts
      --- host.go
   ---main
      --- main.go
   ---redisclient
      --- redisC
   --- go.mod
   --- go.sum
  
  1. src目录,go.mod,go.sum 在同一级
  2. hosts是自定义包
  3. redisclient包是对redis的一些设置

错误内容

build Stephanie.io/main:cannot load hosts: cannot find module providing package hosts

整理不易,如果这个问题对你用,请点击 左上方 向上箭头,谢谢!;问题居然被踩了.... o(╥﹏╥)o

期待答案

  • 给出思路与参考内容
  • 自己的使用经验

各个文件代码

  • host.go
package hosts

import (
    "fmt"
)

// SayHello ....
func SayHello(){
    fmt.Println("Hello!")
}
  • main.go
package main

import (
    "hosts"
)

func main() {
    hosts.SayHello()
}
  • redisC.go
`引入这个包为了 练习使用go mudule引入并使用了redis这个第三方包,在这里不要太在意内容`
package rediscilent

import (
    "github.com/gomodule/redigo/redis"
    "log"
)

// OpenRedisDial ...
func OpenRedisDial()(conn redis.Conn, err error) {
    //address can connect 
    c,err := redis.Dial("tcp", "192.168.0.248:6379")
    if err != nil {
        log.Fatalln(err)
    }
    return c,err;
}

  • go.mod
module stephanie.io

go 1.12

require github.com/gomodule/redigo v2.0.0+incompatibl

注意:module 名为 Stephanie.io 在这里go.sum的内容没有多大意义所以内容就不贴出来了.


如发现问题描述语句不通顺,用词不当,问题不清楚等问题,你可以直接修改,或者在下面评论区说明,尽力使这个问题帮助更多的小伙伴 ゝ

reference:

https://godoc.org/github.com/gomodule/redigo/redis

回复
阅读 3.9k
2 个回答

思路:通过错误信息查询源码,针对到源码所在对应的结构体,通过godoc注释文档和语义化信息可以知道大概是导入包出错.

检查报错文件所对应的的导入包项,是由于go module导入包需要加入module前缀,
因此正确的做法应该是:

main.go

import (
    "stephanie.io/hosts" 
)

点击查看解决过程Gif演示

在使用go module的时候,包的导入路径是:moduleName + pathToPackage,在 main.go 中改为

package main
import (
    "stephanie.io/hosts" //把hosts 改为 stephanie.io/hosts
)
参考内容

The go.mod file only appears in the root of the module. Packages in subdirectories have import paths consisting of the module path plus the path to the subdirectory. For example, if we created a subdirectory world, we would not need to (nor want to) run go mod init there. The package would automatically be recognized as part of the example.com/hello module, with import path example.com/hello/world.

reference blog.golang.org/using-go-modules

A module declares its identity in its go.mod via the module directive, which provides the module path. The import paths for all packages in a module share the module path as a common prefix. The module path and the relative path from the go.mod to a package's directory together determine a package's import path.

reference github.com/golang/go/wiki/Modules

Other Reference:
mfridman.com/golang/go-modules-part1

整理不易,如果这个问题对你用,请点击 左上方 向上箭头,谢谢!

你知道吗?

宣传栏