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的方式類似,區別在於沒有別名,直接用包名 |