Go命令行有常用的這幾個(gè)命令:
- go build 編譯包和依賴(lài)
- go run 編譯和運(yùn)行g(shù)o程序
- go install 編譯并安裝包和依賴(lài)
- go get 將依賴(lài)下載到當(dāng)前依賴(lài)并安裝
go help來(lái)看都可以編譯構(gòu)建,

對(duì)于它們之間的區(qū)別,剛剛上手的同學(xué)可能比較容易混淆,下面我們就通過(guò)思維導(dǎo)圖的方式來(lái)看看這些命令的異同。

go build
go build是這幾個(gè)命令的基礎(chǔ),go build <命令源碼文件/.>會(huì)生成目標(biāo)系統(tǒng)的可執(zhí)行文件

或生成與目錄同名的可執(zhí)行文件

go build對(duì)庫(kù)源碼文件的操作意義就不是很大了,不管是在項(xiàng)目目錄下還是GOPATH目錄下都不會(huì)生成任何文件,只是用來(lái)檢查代碼是否存在編譯錯(cuò)誤。
運(yùn)行g(shù)o build命令時(shí)加入標(biāo)記-x,這樣可以看到go build命令具體都執(zhí)行了哪些操作,查看具體構(gòu)建過(guò)程
go build -x hello_main.go
WORK=/var/folders/js/pmxyyt3s2693n8_dk137t8l80000gn/T/go-build580263953
mkdir -p $WORK/b001/
cat >$WORK/b001/importcfg.link << 'EOF' # internal
packagefile command-line-arguments=/Users/XXX/Library/Caches/go-build/66/66f8de4622b8ffa394c623ca185ac616e298e56b0922df729b6a595f48eafac7-d
packagefile fmt=/usr/local/go/pkg/darwin_amd64/fmt.a
...
packagefile internal/race=/usr/local/go/pkg/darwin_amd64/internal/race.a
EOF
mkdir -p $WORK/b001/exe/
cd .
/usr/local/go/pkg/tool/darwin_amd64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmode=exe -buildid=dvpJi7I5grdSogBnCMbW/lvYsRrpuUSUL86UZI79H/GF71-1TyEJxjFQJjlqbi/dvpJi7I5grdSogBnCMbW -extld=clang /Users/XXX/Library/Caches/go-build/66/66f8de4622b8ffa394c623ca185ac616e298e56b0922df729b6a595f48eafac7-d
/usr/local/go/pkg/tool/darwin_amd64/buildid -w $WORK/b001/exe/a.out # internal
mv $WORK/b001/exe/a.out hello_main
rm -r $WORK/b001/
go run
go run命令編譯構(gòu)建后直接運(yùn)行,不會(huì)在項(xiàng)目目錄或GOPATH目錄下生成可執(zhí)行文件。
傳入-x參數(shù)查看詳細(xì)執(zhí)行過(guò)程可以看出對(duì)比go build,go run省略了mv $WORK/b001/exe/a.out hello_main搬移可執(zhí)行文件,而是直接執(zhí)行輸出結(jié)果。
? cli go run -x hello_main.go
WORK=/var/folders/js/pmxyyt3s2693n8_dk137t8l80000gn/T/go-build971127258
mkdir -p $WORK/b001/
cat >$WORK/b001/importcfg.link << 'EOF' # internal
packagefile command-line-arguments=/Users/XXX/Library/Caches/go-build/71/719f02b57ed687b008c3f0febd1e1153726dca1999dd7c4f88adbbebfa82193c-d
packagefile fmt=/usr/local/go/pkg/darwin_amd64/fmt.a
...
packagefile internal/race=/usr/local/go/pkg/darwin_amd64/internal/race.a
EOF
mkdir -p $WORK/b001/exe/
cd .
/usr/local/go/pkg/tool/darwin_amd64/link -o $WORK/b001/exe/hello_main -importcfg $WORK/b001/importcfg.link -s -w -buildmode=exe -buildid=7eLhf19h12gDZOehA2Ps/E-LrBMzTVfVUHX0egkFE/HKms5XQlG7vZXdMiphwE/7eLhf19h12gDZOehA2Ps -extld=clang /Users/XXX/Library/Caches/go-build/71/719f02b57ed687b008c3f0febd1e1153726dca1999dd7c4f88adbbebfa82193c-d
$WORK/b001/exe/hello_main
Hello Lissdy!
所以不能直接單獨(dú)運(yùn)行的庫(kù)源碼文件不支持該命令。

go install
go install大概等于go build+安裝,所謂安裝就是將命令源碼生成的可執(zhí)行文件或者庫(kù)源碼文件生成的歸檔文件放入GOPATH/bin或GOPATH/pkg中。
go install可執(zhí)行文件從打印的詳細(xì)步驟可以看出主要區(qū)別就是mv $WORK/b001/exe/a.out /Users/XXX/go/bin/hello_main,將可執(zhí)行文件放入GOPATH/bin而不是當(dāng)前目錄下。
? cli go install -x hello_main.go
WORK=/var/folders/js/pmxyyt3s2693n8_dk137t8l80000gn/T/go-build354803648
mkdir -p $WORK/b001/
cat >$WORK/b001/importcfg.link << 'EOF' # internal
packagefile command-line-arguments=/Users/XXX/Library/Caches/go-build/66/66f8de4622b8ffa394c623ca185ac616e298e56b0922df729b6a595f48eafac7-d
packagefile fmt=/usr/local/go/pkg/darwin_amd64/fmt.a
...
packagefile internal/race=/usr/local/go/pkg/darwin_amd64/internal/race.a
EOF
mkdir -p $WORK/b001/exe/
cd .
/usr/local/go/pkg/tool/darwin_amd64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmode=exe -buildid=dvpJi7I5grdSogBnCMbW/lvYsRrpuUSUL86UZI79H/GF71-1TyEJxjFQJjlqbi/dvpJi7I5grdSogBnCMbW -extld=clang /Users/XXX/Library/Caches/go-build/66/66f8de4622b8ffa394c623ca185ac616e298e56b0922df729b6a595f48eafac7-d
/usr/local/go/pkg/tool/darwin_amd64/buildid -w $WORK/b001/exe/a.out # internal
mkdir -p /Users/XXX/go/bin/
mv $WORK/b001/exe/a.out /Users/XXX/go/bin/hello_main
rm -r $WORK/b001/
對(duì)于庫(kù)源碼文件來(lái)說(shuō),當(dāng)module-aware模式打開(kāi)時(shí),執(zhí)行go install只會(huì)構(gòu)建緩存結(jié)果,并不會(huì)將結(jié)果安裝到GOPATH/pkg。

go get
命令go get會(huì)自動(dòng)從一些主流公用代碼倉(cāng)庫(kù)(比如 GitHub)下載目標(biāo)代碼包,并把它們安裝到環(huán)境變量GOPATH相應(yīng)目錄中。
