2014-02-06 130 views
6

我正在寻找一个好的项目组织,用于使用Go编写多个组件的多平台项目。我知道从http://golang.org/doc/code.html推荐的布局,但这里提出的布局似乎不符合我的要求。Golang代码组织,用于多平台多语言项目

项目组成部分是:(写在围棋)

  • 客户端,跨平台(GO)
  • 库,服务器和客户端之间共享

    • 服务器(GO)
    • 一些更多的客户(iOS版,Android版)

    我的要求是:

    • 单个git存储库中的所有组件
    • 保持组件分离(例如,每个组件一个目录)
    • 围棋组件可以构造成多个子包

    我目前的做法:

    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其

    1. 副本lib /到服务器/和客户端/
    2. 分别构建服务器/和客户端/,每次设置GOPATH到r espective目录。

    它的工作原理,但感觉真的很klunky,与推荐的代码布局非常不同。

    这里是我考虑的替代方案:

    project/ (this is the repository root) 
        gospace/ 
        src/ 
         server/... 
         client/... 
         lib/... 
        client-ios/ 
        ... 
        client-android/ 
        ... 
    

    通过这一布局,我有一个GOPATH(gospace /)和不需要klunky Makefile文件。但是,这些组件并不像第一种替代方式那样整齐地分开(即通过顶层目录)。

    我的问题:哪个项目布局最适合我的要求和围棋惯例和工具支持?我还没有看到更好的选择吗?

  • +3

    为什么不是'$ GOPATH/src/gospace/{server,client,lib,ios,android}'。典型的GOPATH结构是$ GOPATH/{src,bin,pkg}。通过这种方式,只需从GOPATH中的任意位置“建立gospace/server”或“gospace/client”即可。 – elithrar

    +0

    这是一个很好的选择,因为它将所有组件都放在同一水平上。将ios和android放在Go工作区内的src目录下感觉有点奇怪。ios和android有自己的子目录结构和自己的src dirs等等,并且与Go无关。 – henning77

    +0

    你可以在GOPATH下检出你的repo(路径将类似于GOPATH/src/project/{gospace,client-ios,client-android})。既然go不会碰到client- *目录,除非你让他这么做,他们会很高兴地一起住在那个目录中。作为奖励,您的项目将变得“可行”。 – mechmind

    回答

    6

    这是我如何组织一个类似的项目:

    $GOPATH/src/project-root/ 
        lib.go 
        lib_test.go 
    
        server/ 
         server.go 
         server_test.go 
    
         main/ 
          server.go // package main; import "project-root/server" 
    
        client/ 
         client.go 
         client_test.go 
    
         main/ 
          client.go //package main; import "project-root/client" 
    
        client-ios/ 
         .... 
    
        client-android/ 
         .... 
    

    虽然大多有server/server.goclient/client.go作为package main应该工作,最好还是分开吧,所以你可以嵌入在其他项目中的客户机/服务器。