1. 程式人生 > >go語言快速入門:專案構建實踐(21)

go語言快速入門:專案構建實踐(21)

在Unix/C的專案中,核心在於Makefile,一個架構怎樣,從Makefile中就可以看出來一些端倪。而在go中,可以使用gomake或者直接使用make都可以進行專案的設計。本文將從Unix/C專案中整理一部分常用的技巧,結合go語言自身特點,討論一下如何進行go語言專案的搭建,本文中大部分的總結同時使用與Unix/Linux下C語言專案的實踐,因為本身就是從相關大型專案中抽取的部分實踐經驗。

Makefile的次佳實踐

最佳實踐永遠是下次才會出現,因此將過去在Unix/C專案中的一部分好的經驗進行整理如下。

規則1:使用include方式

Makefile也像編碼一樣,要講究重用和可擴,因此在include進行變數和Option以及路徑等定義,然後進行統一重用,比如在Makeilfe中這樣寫:

include comset

而在comset檔案中則進行定義變數等:

[root@host31 src]# cat comset
###############################################################################
#MAINTAINER: [email protected]
###############################################################################

##############################
################################################# #COMMAND ############################################################################### CC = go BUILD = ${CC} build CLEAN = ${CC} clean TEST = ${CC} test INSTALL= $(CC) install ...

規則2:Makefile分層

Makefile和comset進行按照定義進行分層,好處在於調整方便,比如調節某一個Option只針對某一個模組(目錄),此種方式就非常方便

規則3:巨集傳遞方式

類似Unix/C下的-D,傳遞巨集開關到系統之中,go是這樣做的:-X main.SOMEMODE=XX
示例如下:

[root@host31 src]# cat main.go
package main

import "fmt"

var SOMEMODE string

func main() {
  fmt.Println("Hello, SOMEMODE=", SOMEMODE)
}
[root@host31 src]#

結果確認:

[root@host31 src]# go build --ldflags "-X main.SOMEMODE=ON" -o hello main.go
[root@host31 src]# ./hello
Hello, SOMEMODE= ON
[root@host31 src]#

規則4:活用偽目標

為了避免is up to date等資訊的出現,活用偽目標規則是一個不錯的選擇,比如docker等的Makefile即為如此。示例:

.PHONY: all build install fmt clean

規則5:活用fmt和vet

活用go vet和go fmt進行語法檢查和程式碼格式整理,這樣能保證程式碼編寫風格的一致以及語法的最低要求。

規則6:活用依賴關係

利用Makefile的依賴規則,比如保證在make build之前一定會做vet和fmt進行語法檢查和格式整理,強制檢查,保證質量於每次基本動作之中,提前發現問題也是新一輪的DevOps文化在反饋迴路中所倡導的。

規則7:明確結果檔案

預設go build預設會以當前目錄名成作為結果檔名,而在實際go build的時候建議加入-o引數指定結果名稱,即使一樣也能清晰看出,看不見的地方COC沒有問題,這種非常扎眼的地方還是不要讓人有Magic Box的的感覺為好。

規則8:命令的使用方式

使用$(shell 命令)的方式即可,可以使用管道以處理一行需要的複雜情況,但儘量不要寫太奇怪而失去可讀性。使用例:讀取當前目錄的父目錄設定為GOPATH

export GOPATH=$(shell pwd |xargs dirname)

Package關聯規則

規則9:package名與資料夾名一致

package名稱最好跟資料夾名稱一致

規則10:package引用方式

相同package之間的引用,不要帶包名,不同package之間雖然可以通過使用import的寫法可以是不帶包名的方式,建議還是帶上包名以表示確定引用出處較好。

包的引用,一般有如下四種方式:

項番 方式 詳細 說明
No.1 . import . 包名 引用的時候無需使用包名
No.2 別名 import 別名 包名 引用的時候使用別名進行引用
No.3 _ import _ 包名 不是為了倒入此包,而是單純地為了呼叫其init函式而已
No.4 import 包名 根No.2的方式類似,區別在於沒有別名,直接用包名

參考