这是我的第一个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工具?
感谢您为新手提供的任何帮助,
安德烈亚斯
答案 0 :(得分:3)
当您运行go build
或go install
时,该命令需要处理一个包列表。如果未指定导入路径,则该操作将应用于当前目录中的包。
因此,如果根目录中没有package main
,则不会生成任何可执行文件。
该命令不会查找子目录。您的cmd
目录中可能有多个命令。在这种情况下,它不知道要构建哪一个。每次构建所有这些都是浪费。