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

时间:2018-01-30 10:11:44

标签: 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.

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

所以我怀疑这毕竟不是它的意思,但我对此并不是那么肯定。是否存在项目布局问题,或者我是否错误地使用了go工具?

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

安德烈亚斯

1 个答案:

答案 0 :(得分:3)

当您运行go buildgo install时,该命令需要处理一个包列表。如果未指定导入路径,则该操作将应用于当前目录中的包。

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

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