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

时间:2019-04-11 11:36:25

标签: 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

这仅适用于go cleango rungo build

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

.
├── Makefile
├── cmd
│   └── server
│       └── main.go
├── go.mod
├── go.sum
└── pkg
    └── storage
        └── mysql
            └── storage.go

go.mod文件的外观如下:

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

require (
    github.com/go-sql-driver/mysql v1.4.1
)

最后是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...
}

有什么想法我做错了吗?

4 个答案:

答案 0 :(得分:1)

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

go mod tidy

答案 1 :(得分:0)

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

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

go build github.com/marvincaspar/go-example/cmd/server

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

go run github.com/marvincaspar/go-example/cmd/server

可以通过提供模块名称/路径与主包的方式来执行清理操作

go clean github.com/marvincaspar/go-example/cmd/server

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

不过,根据https://blog.learngoprogramming.com/code-organization-tips-with-packages-d30de0d11f46,只需将源文件放入项目的根目录。这样更好。

答案 2 :(得分:0)

对于您而言,最好运行go fmt ./...,这意味着将go fmt应用于所有软件包。

答案 3 :(得分:0)

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

go mod init <project_name>
go test

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

相关问题