如何解决 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-clientyamq-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.goclient.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.