如何在Go项目中解析嵌套应用程序二进制文件中的依赖关系?

如何在Go项目中解析嵌套应用程序二进制文件中的依赖关系?,go,dependency-management,go-modules,Go,Dependency Management,Go Modules,这听起来很愚蠢,但我现在正在尝试构建我的新golang项目,我遇到了以下错误 无法加载包:包github.com/kuskmen/yamq/cmd/yamq-client:在C:\projects\yamq\cmd\yamq-client中找到包main(main.go)和yamqclient(yamq-client.go) 我知道这应该是很容易解决的,但我来自.NET,对Go项目及其依赖项解析模型还没有经验,因此很难解决 我的项目结构看起来是这样的 /yamq /cmd

这听起来很愚蠢,但我现在正在尝试构建我的新golang项目,我遇到了以下错误

无法加载包:包github.com/kuskmen/yamq/cmd/yamq-client:在C:\projects\yamq\cmd\yamq-client中找到包main(main.go)和yamqclient(yamq-client.go)

我知道这应该是很容易解决的,但我来自.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客户端
yamq服务器
二进制文件时,我会遇到上述错误,每次我尝试用谷歌搜索它或找到有用的东西时,我都会得到一些可追溯到2013-2016年的老文章或答案,这些文章或答案暗示了关于
$GOPATH
等的一些东西,而我现在的情况不应该是这样尝试使用go模块


帮助一位.NET开发人员加入Go社区,向他解释模块是如何工作的,因为我发现模块没有用,或者至少我没有抓住要点,提前谢谢

对于您的项目,我会这样做:

$ 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

要继续我上面的评论:

发件人:

  • 围棋程序员通常将所有围棋代码保存在一个工作区中
  • 工作区包含许多版本控制存储库(例如,由Git管理)
  • 每个存储库包含一个或多个包
  • 每个包由单个目录中的一个或多个Go源文件组成
  • 包目录的路径决定其导入路径

如何从其main.go导入yamq客户端?我尝试了导入“yamqclient”和导入“github.com/kuskmen/yamq client”,两者都给出了相同的错误:/路径应该反映您的文件系统路径。将其移出
cmd
-没有理由,然后您将拥有
github.com/kuskmen/yamq/yamqclient
。为了保持一致性,还将
yamq客户端
重命名为
yamqclient
。通常,从一个教程中的单个lib结构开始,并在跳到两个独立的主干之前使其工作。硬规则是:同一目录中的任何文件都必须具有一致的包名。因此,如果构建一个可执行文件,那么该目录中的所有文件都以
packagemain
开头。对于包-pkg目录中的所有文件都以
package mypkgname
开头。您看到的错误是警告您在特定的生成目录中混合了
main
yamqclient
包名。@EliBendersky我遵循Go项目模板指南,这就是为什么我像其他项目(kubernetes、heroku等)一样将应用程序二进制文件放在cmd文件夹中的原因