1

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

无法加载包:包 github.com/kuskmen/yamq/cmd/yamq-client:在 C:\projects\yamq\cmd\yamq- 中找到包 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

到目前为止一切顺利,当我go build在最外层目录( /​​yamq )中构建成功(或者至少它没有显示任何错误),但是当我尝试构建任何一个yamq-clientyamq-server二进制文件时,我都会收到上述错误,每次我尝试谷歌它或找到一些有用的东西我得到了一些可以追溯到 2013-2016 年的旧文章或答案,其中提出了一些关于$GOPATH等的内容,因为我正在尝试使用 go 模块,所以这里不应该是这种情况。

帮助 .NET 开发人员加入 Go 社区,向他解释模块是如何工作的,因为我发现这个这个没用,或者至少我没有抓住重点,在此先感谢!

4

2 回答 2

1

从我上面的评论中跟进:

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

  • Go 程序员通常将所有 Go 代码保存在一个工作区中。
  • 一个工作区包含许多版本控制存储库(例如,由 Git 管理)。
  • 每个存储库都包含一个或多个包。
  • 每个包都包含一个或多个 Go 源文件,位于单个目录中。
  • 包目录的路径决定了它的导入路径。
于 2019-02-14T19:56:30.260 回答
1

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

$ 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

客户端看起来是对称的。

变体:您可以通过.go文件cmd/...的实际二进制名称来命名文件 - 比如server.goclient.go. 每个中的包仍然是main,但随后go build会创建一个具有文件名(没有 )的可执行文件,.go而无需-o明确说明。

于 2019-02-14T14:02:02.673 回答