關於Go tools的比較有用的flags

itfanr發表於2016-10-10

你剛接觸Go tools嗎?或者你想擴充套件下你的知識面?這篇文章是關於Go tools的flags,這些flags每個人都應該知道。

免責宣告:這篇檔案可能有一些偏見。這是我個人常用的flags集合。我周邊的人很難找到這些falgs的參考文件。如果你有更好的主意,可以在Twitter上私信我。

$ go build -x

-x列出了go build觸發的所有命令。

如果你對Go的工具鏈、使用跨平臺編譯器比較好奇,或者對傳入外部編譯器的flags不清楚,或者懷疑連結器有bug,那麼使用-x來檢視所有的觸發。

$ go build -x

WORK=/var/folders/00/1b8h8000h01000cxqpysvccm005d21/T/go-build600909754
mkdir -p $WORK/hello/perf/_obj/
mkdir -p $WORK/hello/perf/_obj/exe/
cd /Users/jbd/src/hello/perf
/Users/jbd/go/pkg/tool/darwin_amd64/compile -o $WORK/hello/perf.a -trimpath $WORK -p main -complete -buildid bbf8e880e7dd4114f42a7f57717f9ea5cc1dd18d -D _/Users/jbd/src/hello/perf -I $WORK -pack ./perf.go
cd .
/Users/jbd/go/pkg/tool/darwin_amd64/link -o $WORK/hello/perf/_obj/exe/a.out -L $WORK -extld=clang -buildmode=exe -buildid=bbf8e880e7dd4114f42a7f57717f9ea5cc1dd18d $WORK/hello/perf.a
mv $WORK/hello/perf/_obj/exe/a.out perf

$go build -gcflags

用來給Go編譯器傳入引數。go tool compile -help列出了可以被傳入編譯器的所有的引數列表。

比如,為了禁止編譯器優化和內聯,你可以使用下面的gcfalgs:

$ go build -gcflags="-N -l"

$go test -v

它提供了非正式的測試輸出,列印了測試的名字、狀態(通過或者失敗)、耗時、測試用例的日誌等。

不帶有-vflag的go test命令非常安靜,我經常把-v開關開啟。比如輸出如下:

$ go test -v context
=== RUN   TestBackground
--- PASS: TestBackground (0.00s)
=== RUN   TestTODO
--- PASS: TestTODO (0.00s)
=== RUN   TestWithCancel
--- PASS: TestWithCancel (0.10s)
=== RUN   TestParentFinishesChild
--- PASS: TestParentFinishesChild (0.00s)
=== RUN   TestChildFinishesFirst
--- PASS: TestChildFinishesFirst (0.00s)
=== RUN   TestDeadline
--- PASS: TestDeadline (0.16s)
=== RUN   TestTimeout
--- PASS: TestTimeout (0.16s)
=== RUN   TestCanceledTimeout
--- PASS: TestCanceledTimeout (0.10s)
...
PASS
ok      context 2.426s

$go test -race

Go競爭檢測工具可以通過--race使用。go test也支援這個flag並且報告競爭。在開發階段使用這個flag可以檢測競爭。

$go test -run

使用-runflag,你可以通過正則過濾測試用例。下面的命令會只測試test examples

$ go test -run=Example

$go test -coverprofile

你可以輸出一個覆蓋資訊,如果你在測試一個包,然後使用go tool來在瀏覽器上實現視覺化:

$ go test -coverprofile=c.out && go tool cover -html=c.out

上面的命令會建立一個覆蓋資訊,然後在瀏覽器上開啟結果頁面。視覺化後的結果會類似下面的頁面:

此處輸入圖片的描述

$go test -exec

這是一個鮮為人知的特性,使用-exec這個flag,你可以用另外的程式和tools互動。這個flag允許你使用Go tool把一些工作代理到另外的程式。

使用這個flag常用的需求場景是:當你需要做更多的事情,而不是僅僅執行宿主機的程式。Go的Android build,使用了-exec來推送測試二進位制檔案到Android裝置(通過使用adb),並收集測試結果。可以作為一個參考。

$go get -u

如果你執行go-test命令來獲取一個已經在GOPATH中的包,那麼go-get不好更新包到最新版本,而-u會強制tool同步這個倉庫的最新的版本。

如果你是一個library的作者,那麼你可能喜歡寫你的安裝說明通過-uflag,比如,golint這樣的方式:

$ go get -u github.com/golang/lint/golint

$go get -d

如果你只想clone一個repo到GOPATH,跳過編譯和安裝過程,那麼使用-d。它會下載包,然後在嘗試編譯和安裝之前停止。

我經常使用它,作為git clone的替代命令,使用虛假的URLs,因為它會克隆這個repo到它合適的GOPATH。比如:

$ go get -d golang.org/x/oauth2/...

會克隆包到$GOPATH/src/golang.org/x/ouath2。給出的golang.org/x/oauth2是一個虛假的URL,go-get這個倉庫是很有用的,而不是嘗試知道知己的repo是什麼(go.googlesource.com/oauth2)。

$go get -t

如果你的包需要額外的包來測試,-t會允許你在go-get過程中下載它們。如果你不傳入-t引數,go get會只下載非測試程式碼的依賴。

$ go list -f

允許你下載Go包以一種自定義的格式。對寫bash指令碼非常有用。下面的命令會輸出runtime包的依賴:

$ go list -f '{{.Deps}}' runtime
[runtime/internal/atomic runtime/internal/sys unsafe]

更多的格式化資訊可以在Dave Cheney的文章的go list章節得到。

英文原文

相關文章