[譯] 關于 Go tools 的比較有用的 flags
關于Go tools的比較有用的flags
你剛接觸Go tools嗎?或者你想擴展下你的知識面?這篇文章是關于Go tools的flags,這些flags每個人都應該知道。
免責聲明:這篇文件可能有一些偏見。這是我個人常用的flags集合。我周邊的人很難找到這些falgs的參考文檔。如果你有更好的主意,可以在 推ter 上私信我。
$ 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
它提供了非正式的測試輸出,打印了測試的名字、狀態(通過或者失敗)、耗時、測試用例的日志等。
不帶有 -v flag的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
使用 -run flag,你可以通過正則過濾測試用例。下面的命令會只測試 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的作者,那么你可能喜歡寫你的安裝說明通過 -u flag,比如,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]
來自:https://github.com/itfanr/articles-about-golang/blob/master/2016-09/1.go-tool-flags.md