【发布时间】:2014-03-04 03:20:39
【问题描述】:
我正在为一个包含多个用 Go 编写的组件的多平台项目寻找一个好的项目组织。我知道http://golang.org/doc/code.html 推荐的布局,但那里建议的布局似乎不符合我的要求。
项目组成部分是:
- 服务器(用 Go 编写)
- 客户端,跨平台(Go)
- 库,在服务器和客户端之间共享 (Go)
- 更多客户端(iOS、Android)
我的要求是:
- 单个 git 存储库中的所有组件
- 保持组件分离(例如,每个组件一个目录)
- Go 组件可以构造成多个子包
我目前的做法:
project/ (this is the repository root)
server/
server.go (package main)
src/
server/
package1/
package1.go
...
client/
client.go (package main)
src/
client/
package2/
package2.go
...
lib/
src/
lib/
lib.go
...
client-ios/
...
client-android/
...
为了构建,我使用了一个 Makefile
- 将 lib/ 复制到服务器/和客户端/中
- 分别构建server/和client/,每次设置GOPATH到各自的目录。
它可以工作,但感觉很笨拙,并且与推荐的代码布局完全不同。
这是我正在考虑的替代方案:
project/ (this is the repository root)
gospace/
src/
server/...
client/...
lib/...
client-ios/
...
client-android/
...
使用这种布局,我有一个 GOPATH (gospace/),不需要笨拙的 Makefile。但是,组件并没有像第一个替代方案那样整齐地分开(即通过顶级目录)。
我的问题:哪种项目布局最适合我的需求以及 Go 约定和工具支持?有没有更好的选择?
【问题讨论】:
-
为什么不
$GOPATH/src/gospace/{server,client,lib,ios,android}。典型的 GOPATH 结构是 $GOPATH/{src,bin,pkg}。通过这种方式,您可以轻松地在 GOPATH 上的任何位置发送go build gospace/server或gospace/client。 -
这是一个不错的选择,因为它将所有组件放在同一级别。将 ios 和 android 放在 Go 工作区的 src 目录下感觉有点奇怪。 ios 和 android 有自己的子目录结构,有自己的 src 目录等,与 Go 无关。
-
你可以在 GOPATH 下签出你的仓库(路径类似于 GOPATH/src/project/{gospace,client-ios,client-android})。由于 go 在您要求他这样做之前不会接触 client-* 目录,因此它们将愉快地一起生活在该目录中。作为奖励,您的项目将变为
go getable。
标签: go organization code-organization project-organization