如何在Go项目中解析嵌套应用程序二进制文件中的依赖关系?
这听起来很愚蠢,但我现在正在尝试构建我的新golang项目,我遇到了以下错误 无法加载包:包github.com/kuskmen/yamq/cmd/yamq-client:在C:\projects\yamq\cmd\yamq-client中找到包main(main.go)和yamqclient(yamq-client.go) 我知道这应该是很容易解决的,但我来自.NET,对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
/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文件夹中的原因