了解如何构建 Go 源代码

Understanding How to Build Go Source

我对如何布局我的 Go 项目以及如何构建它感到困惑。我是 Go 的新手,我相信在 <1.13 的时候 GOPATH 很重要。我使用的是 1.14,所以我相信我不必关心它并且 GOPATH 是 not 集。我(目前)没有在 GitHub 上托管我的代码(这是各种文章假设的)。我已经阅读了很多东西,但这让我更加困惑:

我根据这个布置了我的项目:https://github.com/golang-standards/project-layout。 (除了这个项目似乎使用了一个 Makefile。我不想写一个 Makefile。我相信这应该没有 Makefile 都可以。我真的不想写一个 Makefile。)

结构如下:

/src
  /cmd
    main.go
  /internal
    helper.go
  go.mod

go.mod 看起来像这样:

module mycompany/mymodule
    
go 1.14

service.go 看起来如下 package main // 这必须被调用 'main'

import (
    "mycompany/mymodule/internal/helper"
)

func main () {
    helper.greet("Jenny")
}

所以,如果我在 /src 并且我 运行 build cmd/service.go 我得到 cmd/service.go:4:2: 包 mycompany/mymodule/internal/helper 不在 GOROOT 中 (/usr/local/Cellar/go/1.14.5/libexec/src/mycompany/mymodule/internal/helper)

我必须先编译 helper.go 吗?手动?当然不是。 go build 应该可以构建我的整个项目吧?包括所有依赖项。有人可以告诉我我缺少什么吗?

当您 运行 go build 没有指定文件路径时,它将在当前目录的任何 .go 文件中寻找 main 函数来启动。它不会构建整个项目。但在这种情况下这不是问题。

您导入了错误的包。要导入的包名称必须是 mycompany/mymodule/internal 而不是 mycompany/mymodule/internal/helper.

并且要调用另一个包内的函数,它必须暴露给外部。 所以你必须将函数 greet() 声明为 Greet()