我正在用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 clean,go 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 之外开发项目要容易得多
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的规定,只需将源文件放入项目的根目录即可。这样更好。
我通常使用 go get 和 go mod tidy 来做同样的事情。它一直有效。
go mod tidy
Run Code Online (Sandbox Code Playgroud)
如果您使用工作区,也可能会发生这种情况。如果您正在使用其他带有工作区的软件包,则似乎无法在没有工作区的情况下使用一个软件包。
因此,请尝试进入您的顶级工作区并执行以下操作
go work use ./problemPackage。
至少这对我有用。