可以将一个主包放在 cmd/myapp 子目录中吗?

awa*_*ner 6 go

这是我的第一个 Go 项目,我很难掌握有关代码组织的不同文档(例如,我发现很难分辨哪些已被取代,或适用于已弃用的供应商工具/方法)。我最终选择了 Ben Johnson 的Standard Package Layout,它有一个非常纤薄的根包(在我项目的根目录中)和大部分代码位于 internal/pkg/...

但是,我添加了一个 cmd/myapp 目录并将可执行程序的 main.go 文件放在那里,因为我认为这是一种常见模式。

所以现在我有:

myapp
|
+- myapp.go   // "package myapp", with only type and interface declarations and no imports
|
+- cmd
|   |
|   +- main.go // "package main", with import gitlab.tld/username/myapp, gitlab.tld/username/myapp/internal/pkg/routing etc.
|
+- internal
    |
    +- pkg
        |
        +- routing
        |    |
        |    +- routing.go // "package routing"
        |
        +- sql 
        |
        +- etc.
Run Code Online (Sandbox Code Playgroud)

现在,当我转到 cmd/myapp 并调用 时go build,它构建良好并留下一个可执行文件,该可执行文件在那里执行它应该执行的操作。但是当我go build -v从项目的主目录调用时,没有生成可执行文件。实际上,似乎只处理了仅包含类型定义的 myapp.go。(当然,go install也不会产生二进制文件。go get -v gitlab.tld/username/myapp似乎也没有做任何事情。)

所以我怀疑这毕竟不是它的意思,但我对此也不太确定。是项目布局有问题,还是我对 go tool 的使用有误?

感谢您为这个新手提供的任何帮助,

安德烈亚斯

dev*_*max 4

当您运行go buildgo install命令期望处理包列表时。如果未给出导入路径,则该操作适用于当前目录中的包。

因此,如果根目录中没有package main,则不会生成可执行文件。

该命令不会在子目录中查找。您的cmd目录中可能有多个命令。在这种情况下,它不知道要构建哪一个。每次都构建所有这些都是浪费。