2015-06-03 151 views
31

新的Go程序員經常不知道或者不知道基本的go build命令做了什麼。構建構建是什麼?

確切地說,go buildgo install命令是什麼構建的?它們在哪裏放置結果/輸出?

回答

45

go命令的作用取決於我們是將其運行於「普通」軟件包還是特殊的"main"軟件包。

對於包

  • go build  建立你的包,那麼丟棄結果
  • go install builds然後安裝該包在您的$GOPATH/pkg目錄中。

對於命令(包main

  • go build  構建命令並離開結果在當前工作目錄
  • go install在臨時目錄中生成命令,然後將其移至$GOPATH/bin

基本上你可以使用go build作爲檢查該包可建(連同它們的依賴),同時也go install(永久)安裝在您的$GOPATH的正確文件夾中的結果。

go build將靜靜地終止,如果一切正常,並會給你錯誤消息,如果包不能建立/編譯。

每當go工具安裝包或二進制文件,也安裝任何依賴它,所以運行go install還將安裝軟件包程序取決於(公之於衆,「去gettable」包),自動。

首先,請閱讀官方How to Write Go Code頁面。有關go工具

的更多信息:Command go

您還可以通過運行以下命令獲得更多的幫助:

go help build 

還值得一提的是,開始進入1.5 go install還刪除創建可執行文件通過go buildsource):

如果'去安裝'(沒有參數,意味着當前目錄) 成功,請刪除由'go build'編寫的可執行文件(如果存在)。這避免了遺留一個陳舊的二進制文件......

要完成該列表,go run將您的應用程序編譯到一個臨時文件夾中,並啓動該可執行二進制文件。當應用程序存在時,它會正確清理臨時文件。

問題由Dave切尼的What does go build build?

+1

似乎很奇怪,安裝不會更新可執行文件,如果它與以前安裝的可執行文件相同...任何見解? –

4

激發了包:

go build:建立你的包,那麼丟棄結果

轉到後這不會是真的1.10(Q1 2018),感謝CL 68116CL 75473。見this thread,我在這裏引用。

什麼完全go buildgo install命令建立

每當去工具安裝包或二進制文件,也安裝有任何依賴性,因此運行去安裝也將安裝軟件包你程序依賴於(公開可用,「去獲取」包),自動。

其實... go install將在新的緩存另外與圍棋1.10,也隨之變化:

的 「go install」 命令不再安裝命名包的依賴(CL 75850 )。

如果您運行「go install foo」,則唯一安裝的是foo

之前,它有所不同。如果依賴關係過時,「go install」也安裝了任何依賴項。
在「go install」期間隱式安裝依賴關係給用戶造成了很多困惑和麻煩,但之前需要啓用增量構建。
不再。
我們認爲新的「install what I said」語義會更容易理解,特別是因爲從錯誤報告中可以清楚地看到許多用戶已經預料到它們。
要強制安裝依賴的過程中「go install」,用「go build -i」和「go test -i」使用新的「go install -i,觸類旁通。

其用於安裝任何重修依賴性「go install」結合引起混亂最常與-a,這意味着「force rebuild of all dependencies」事實。
現在,「go install -a myprog」將強制完全重建所有依賴關係myprog以及myprog本身,但只會安裝myprog。(當然,所有重建的依賴關係仍然會保存在構建緩存中)。
使這個案例更容易理解對於結合基於內容的新過時分析特別重要,因爲它看到了更經常重建依賴關係的充分理由比以前,這會增加「爲什麼我的依賴安裝」的混亂。例如,如果運行「go install -gcflags=-N myprog」,則安裝不帶編譯器優化構建的myprog,但它不再從沒有編譯器優化的標準庫中重新安裝包的使用myprog

相關問題