[译] 关于 Go tools 的比较有用的 flags
DerekVes
8年前
<p>关于Go tools的比较有用的flags</p> <p>你刚接触Go tools吗?或者你想扩展下你的知识面?这篇文章是关于Go tools的flags,这些flags每个人都应该知道。</p> <p>免责声明:这篇文件可能有一些偏见。这是我个人常用的flags集合。我周边的人很难找到这些falgs的参考文档。如果你有更好的主意,可以在 <a href="/misc/goto?guid=4959717429163387227" rel="nofollow,noindex">推ter</a> 上私信我。</p> <h2><strong>$ go build -x</strong></h2> <p>-x 列出了go build触发的所有命令。</p> <p>如果你对Go的工具链、使用跨平台编译器比较好奇,或者对传入外部编译器的flags不清楚,或者怀疑链接器有bug,那么使用 -x 来查看所有的触发。</p> <h2><strong>$ go build -x</strong></h2> <pre> <code class="language-go">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</code></pre> <h2><strong>$go build -gcflags</strong></h2> <p>用来给Go编译器传入参数。 go tool compile -help 列出了可以被传入编译器的所有的参数列表。</p> <p>比如,为了禁止编译器优化和内联,你可以使用下面的gcfalgs:</p> <pre> <code class="language-go">$ go build -gcflags="-N -l"</code></pre> <h2><strong>$go test -v</strong></h2> <p>它提供了非正式的测试输出,打印了测试的名字、状态(通过或者失败)、耗时、测试用例的日志等。</p> <p>不带有 -v flag的go test命令非常安静,我经常把 -v 开关打开。比如输出如下:</p> <pre> <code class="language-go">$ 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</code></pre> <h2><strong>$go test -race</strong></h2> <p><a href="/misc/goto?guid=4959717661370756500" rel="nofollow,noindex">Go竞争检测工具</a> 可以通过 --race 使用。go test也支持这个flag并且报告竞争。在开发阶段使用这个flag可以检测竞争。</p> <h2><strong>$go test -run</strong></h2> <p>使用 -run flag,你可以通过正则过滤测试用例。下面的命令会只测试 <a href="/misc/goto?guid=4959717429258698434" rel="nofollow,noindex">test examples</a> :</p> <pre> <code class="language-go">$ go test -run=Example</code></pre> <h2><strong>$go test -coverprofile</strong></h2> <p>你可以输出一个覆盖信息,如果你在测试一个包,然后使用go tool来在浏览器上实现可视化:</p> <pre> <code class="language-go">$ go test -coverprofile=c.out && go tool cover -html=c.out</code></pre> <p>上面的命令会创建一个覆盖信息,然后在浏览器上打开结果页面。可视化后的结果会类似下面的页面:</p> <p><img src="https://simg.open-open.com/show/ef56bf21fe72e6992d2672f3c36ee61a.png"></p> <h2><strong>$go test -exec</strong></h2> <p>这是一个鲜为人知的特性,使用 -exec 这个flag,你可以用另外的程序和tools交互。这个flag允许你使用Go tool把一些工作代理到另外的程序。</p> <p>使用这个flag常用的需求场景是:当你需要做更多的事情,而不是仅仅执行宿主机的程序。Go的Android build,使用了 -exec 来推送测试二进制文件到Android设备(通过使用 adb ),并收集测试结果。可以作为一个参考。</p> <h2><strong>$go get -u</strong></h2> <p>如果你执行go-test命令来获取一个已经在GOPATH中的包,那么go-get不好更新包到最新版本,而 -u 会强制tool同步这个仓库的最新的版本。</p> <p>如果你是一个library的作者,那么你可能喜欢写你的安装说明通过 -u flag,比如,golint这样的方式:</p> <pre> <code class="language-go">$ go get -u github.com/golang/lint/golint</code></pre> <h2><strong>$go get -d</strong></h2> <p>如果你只想clone一个repo到GOPATH,跳过编译和安装过程,那么使用 -d 。它会下载包,然后在尝试编译和安装之前停止。</p> <p>我经常使用它,作为git clone的替代命令,使用虚假的URLs,因为它会克隆这个repo到它合适的GOPATH。比如:</p> <pre> <code class="language-go">$ go get -d golang.org/x/oauth2/...</code></pre> <p>会克隆包到 $GOPATH/src/golang.org/x/ouath2 。给出的 golang.org/x/oauth2 是一个虚假的URL,go-get这个仓库是很有用的,而不是尝试知道知己的repo是什么(go.googlesource.com/oauth2)。</p> <h2><strong>$go get -t</strong></h2> <p>如果你的包需要额外的包来测试, -t 会允许你在go-get过程中下载它们。如果你不传入 -t 参数,go get会只下载非测试代码的依赖。</p> <h2><strong>$ go list -f</strong></h2> <p>允许你下载Go包以一种自定义的格式。对写bash脚本非常有用。下面的命令会输出runtime包的依赖:</p> <pre> <code class="language-go">$ go list -f '{{.Deps}}' runtime [runtime/internal/atomic runtime/internal/sys unsafe]</code></pre> <p> </p> <p> </p> <p>来自:https://github.com/itfanr/articles-about-golang/blob/master/2016-09/1.go-tool-flags.md</p> <p> </p>