go mod: 找不到 module 提供包
go mod: cannot find module providing package
我正在创建一个版本为 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 clean
、go run
或 go 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...
}
知道我做错了什么吗?
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 可以通过提供 module-name/path-with-main-package
以相同的方式执行
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,只需将源文件放入项目的根目录即可。这样更好。
通常这种新的项目方法适合我:
go mod init <project_name>
go test
我发现在 GOROOT 和 GOPATH 之外开发项目要容易得多
我通常使用 go get 和 go mod tidy。它一直有效。
go mod tidy
我正在创建一个版本为 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 clean
、go run
或 go 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...
}
知道我做错了什么吗?
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 可以通过提供 module-name/path-with-main-package
以相同的方式执行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,只需将源文件放入项目的根目录即可。这样更好。
通常这种新的项目方法适合我:
go mod init <project_name>
go test
我发现在 GOROOT 和 GOPATH 之外开发项目要容易得多
我通常使用 go get 和 go mod tidy。它一直有效。
go mod tidy