如何解决 Go 项目中嵌套应用程序二进制文件中的依赖项?
How can I resolve dependencies in nested application binary in Go project?
这听起来很愚蠢,但我正在尝试构建我的新 golang 项目一段时间,但我遇到了以下错误
can't load package: package github.com/kuskmen/yamq/cmd/yamq-client: found packages main (main.go) and yamqclient (yamq-client.go) in C:\projects\yamq\cmd\yamq-client
我知道这应该很容易修复,但我来自 .NET,我在 Go 项目及其依赖项解析模型方面仍然没有经验,因此遇到了困难。
我的项目结构是这样的
/yamq
/cmd
/yamq-client // yamq client application binary
main.go // package main
yamq-client.go // package yamqclient
/yamq-server // yamq server application binary
main.go // package main
yamq-server.go // package yamqserver
go.mod // contains only "module github.com/kuskmen/yamq" for now
... // some library files that will probably be moved to /shared folder
到目前为止一切顺利,当我在最外层目录 ( /yamq ) 中执行 go build
时,它正在成功构建(或者至少没有显示任何错误),但是当我尝试构建任何一个时 yamq-client
或 yamq-server
二进制文件我收到上述错误,每次我尝试 google 它或找到有用的东西时,我都会得到一些旧文章或答案,这些文章或答案可以追溯到 2013-2016 年,它暗示了一些关于 $GOPATH
等这里不应该是这种情况,因为我正在尝试使用 go 模块。
帮助一位 .NET 开发人员加入 Go 社区,向他解释模块的确切工作原理,因为我发现 this and this 没用,或者至少我忽略了重点,在此先感谢!
对于你的项目,我会做这样的事情:
$ tree
.
├── clientlib
│ └── lib.go
├── cmd
│ ├── client
│ │ └── main.go
│ └── server
│ └── main.go
├── go.mod
└── serverlib
└── lib.go
5 directories, 5 files
$ cat go.mod
module myproject.com
模块名称随意(可以是github.com/yourname/yourproject
)。
对于服务器端:
$ cat serverlib/lib.go
package serverlib
import "fmt"
func Hello() {
fmt.Println("Hello from serverlib.Hello")
}
$ cat cmd/server/main.go
package main
import (
"fmt"
"myproject.com/serverlib"
)
func main() {
fmt.Println("Running server")
serverlib.Hello()
}
现在我们可以构建 运行 它了:
$ go build -o server cmd/server/main.go
$ ./server
Running server
Hello from serverlib.Hello
客户端看起来是对称的。
变体:您可以使用实际的二进制名称来命名 cmd/...
中的 .go
文件,例如 server.go
和 client.go
。每个包中的包仍然是 main
,但是 go build
使用文件名(没有 .go
)创建一个可执行文件,而不需要显式 -o
。
根据我上面的评论跟进:
来自https://golang.org/doc/code.html:
- Go programmers typically keep all their Go code in a single workspace.
- A workspace contains many version control repositories (managed by Git, for example).
- Each repository contains one or more packages.
- Each package consists of one or more Go source files in a single directory.
- The path to a package's directory determines its import path.
这听起来很愚蠢,但我正在尝试构建我的新 golang 项目一段时间,但我遇到了以下错误
can't load package: package github.com/kuskmen/yamq/cmd/yamq-client: found packages main (main.go) and yamqclient (yamq-client.go) in C:\projects\yamq\cmd\yamq-client
我知道这应该很容易修复,但我来自 .NET,我在 Go 项目及其依赖项解析模型方面仍然没有经验,因此遇到了困难。
我的项目结构是这样的
/yamq
/cmd
/yamq-client // yamq client application binary
main.go // package main
yamq-client.go // package yamqclient
/yamq-server // yamq server application binary
main.go // package main
yamq-server.go // package yamqserver
go.mod // contains only "module github.com/kuskmen/yamq" for now
... // some library files that will probably be moved to /shared folder
到目前为止一切顺利,当我在最外层目录 ( /yamq ) 中执行 go build
时,它正在成功构建(或者至少没有显示任何错误),但是当我尝试构建任何一个时 yamq-client
或 yamq-server
二进制文件我收到上述错误,每次我尝试 google 它或找到有用的东西时,我都会得到一些旧文章或答案,这些文章或答案可以追溯到 2013-2016 年,它暗示了一些关于 $GOPATH
等这里不应该是这种情况,因为我正在尝试使用 go 模块。
帮助一位 .NET 开发人员加入 Go 社区,向他解释模块的确切工作原理,因为我发现 this and this 没用,或者至少我忽略了重点,在此先感谢!
对于你的项目,我会做这样的事情:
$ tree
.
├── clientlib
│ └── lib.go
├── cmd
│ ├── client
│ │ └── main.go
│ └── server
│ └── main.go
├── go.mod
└── serverlib
└── lib.go
5 directories, 5 files
$ cat go.mod
module myproject.com
模块名称随意(可以是github.com/yourname/yourproject
)。
对于服务器端:
$ cat serverlib/lib.go
package serverlib
import "fmt"
func Hello() {
fmt.Println("Hello from serverlib.Hello")
}
$ cat cmd/server/main.go
package main
import (
"fmt"
"myproject.com/serverlib"
)
func main() {
fmt.Println("Running server")
serverlib.Hello()
}
现在我们可以构建 运行 它了:
$ go build -o server cmd/server/main.go
$ ./server
Running server
Hello from serverlib.Hello
客户端看起来是对称的。
变体:您可以使用实际的二进制名称来命名 cmd/...
中的 .go
文件,例如 server.go
和 client.go
。每个包中的包仍然是 main
,但是 go build
使用文件名(没有 .go
)创建一个可执行文件,而不需要显式 -o
。
根据我上面的评论跟进:
来自https://golang.org/doc/code.html:
- Go programmers typically keep all their Go code in a single workspace.
- A workspace contains many version control repositories (managed by Git, for example).
- Each repository contains one or more packages.
- Each package consists of one or more Go source files in a single directory.
- The path to a package's directory determines its import path.