我正在使用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...
}
有什么想法我做错了吗?
答案 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之外开发项目要容易得多