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

时间:2019-02-14 01:01:29

标签: go dependency-management go-modules

这听起来很愚蠢,但我现在尝试构建我的新golang项目已有一段时间,并且因以下错误而陷入困境

  

无法加载程序包:程序包github.com/kuskmen/yamq/cmd/yamq-client:在C:\ projects \ yamq \ cmd中找到了程序包main(main.go)和yamqclient(yamq-client.go)。 \ 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时,它可以成功构建(或者至少没有显示任何错误),但是当我尝试构建任一{{1} }或yamq-client二进制文件时,我得到上述错误,每次尝试搜索它或发现有用的东西时,我都会得到一些旧文章或答案,这些文章或答案可以追溯到2013-2016年,其中提出了有关yamq-server等内容既然我正在尝试使用go模块,那就不应该了。

通过向他解释模块是如何工作的,帮助他向.NET开发人员加入Go社区,因为我发现thisthis毫无用处,或者至少是我没注意这一点,谢谢!!

2 个答案:

答案 0 :(得分:1)

在我上面的评论中跟进:

来自https://golang.org/doc/code.html

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

答案 1 :(得分:0)

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

$ 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

客户端看起来很对称。

变化:您可以使用实际的二进制名称(如.gocmd/...来命名server.go中的client.go个文件。每个程序包中的程序包仍为main,但随后go build使用文件名(不含.go)创建可执行文件,而无需明确地-o