go mod:找不到提供包的模块

Mar*_*par 6 go go-modules

我正在用1.12.1版创建一个go项目。如果我运行GOPATH="$(pwd)/vendor:$(pwd)" GOBIN="$(pwd)/bin" go clean,会出现以下错误:

can't load package: package github.com/marvincaspar/go-example: unknown import path "github.com/marvincaspar/go-example": cannot find module providing package github.com/marvincaspar/go-example
Run Code Online (Sandbox Code Playgroud)

这仅适用于go cleango run或者go build效果很好。

这是主要代码的文件夹结构:

.
??? Makefile
??? cmd
?   ??? server
?       ??? main.go
??? go.mod
??? go.sum
??? pkg
    ??? storage
        ??? mysql
            ??? storage.go
Run Code Online (Sandbox Code Playgroud)

go.mod文件的外观如下:

module github.com/marvincaspar/go-example
go 1.12

require (
    github.com/go-sql-driver/mysql v1.4.1
)
Run Code Online (Sandbox Code Playgroud)

最后是main.go文件:

package main

import (
    "fmt"
    "os"

    "github.com/marvincaspar/go-example/pkg/storage/mysql"
)

func main() {
    if err := run(); err != nil {
        fmt.Fprintf(os.Stderr, "%v", err)
        os.Exit(1)
    }
}

func run() error {
    // init storage
    s := mysql.NewStorage()
    // do some other stuff...
}

Run Code Online (Sandbox Code Playgroud)

有什么想法我做错了吗?

小智 17

通常这种新的项目方法对我有用:

go mod init <project_name>
go test
Run Code Online (Sandbox Code Playgroud)

我发现在 GOROOT 和 GOPATH 之外开发项目要容易得多


Sha*_*arg 8

Go build / install试图在您的根目录中找到主程序包,而不是检查子目录(cmd / server)。因此,您将收到未找到包错误。

要正确地构建代码,可以运行:

go build github.com/marvincaspar/go-example/cmd/server
Run Code Online (Sandbox Code Playgroud)

同样,要运行您的项目,您将必须提供module-name / main-package-path:

go run github.com/marvincaspar/go-example/cmd/server
Run Code Online (Sandbox Code Playgroud)

通过提供模块名称/带有主包的路径,可以以相同的方式执行清除操作

go clean github.com/marvincaspar/go-example/cmd/server
Run Code Online (Sandbox Code Playgroud)

要么

GOPATH="$(pwd)/vendor:$(pwd)" GOBIN="$(pwd)/bin" go clean github.com/marvincaspar/go-example/cmd/server 
Run Code Online (Sandbox Code Playgroud)

但是,按照https://blog.learngoprogramming.com/code-organization-tips-with-packages-d30de0d11f46的规定,只需将源文件放入项目的根目录即可。这样更好。

  • 如果 github.com/name 发生变化,您需要更改什么?(即,为了你分叉的东西?) (2认同)

BIT*_*ESH 5

我通常使用 go get 和 go mod tidy 来做同样的事情。它一直有效。

go mod tidy
Run Code Online (Sandbox Code Playgroud)

  • 这个答案很到位。只是从文档中添加一些额外的细节[此处](https://go.dev/ref/mod#go-mod-tidy)。`go mod tidy` 确保 go.mod 文件与模块中的源代码匹配。它添加了构建当前模块的包和依赖项所需的任何缺失的模块要求,并删除了对不提供任何相关包的模块的要求。它还将所有缺失的条目添加到 go.sum 并删除不必要的条目。 (2认同)

Joh*_*len 5

如果您使用工作区,也可能会发生这种情况。如果您正在使用其他带有工作区的软件包,则似乎无法在没有工作区的情况下使用一个软件包。

因此,请尝试进入您的顶级工作区并执行以下操作

go work use ./problemPackage

至少这对我有用。