2014-02-06 56 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應該工作,最好還是分開吧,所以你可以嵌入在其他項目中的客戶機/服務器。