This commit is contained in:
chai2010
2015-12-21 12:55:18 +08:00
parent 1d7534e3c3
commit 7ec2f7cdc1
152 changed files with 54426 additions and 8958 deletions

View File

@@ -1,11 +1,11 @@
### 10.7.3. 構建包
`go build` 命令編譯參數指定的每個包. 如果包是一個庫, 則忽略輸齣結果; 這可以用於檢測包的可以正確編譯的.
如果包的名字是 main, `go build` 將調用連接器在當前目創建一個可執行程序; 導入路徑的最後一段作可執行程序的名字.
如果包的名字是 main, `go build` 將調用連接器在當前目創建一個可執行程序; 導入路徑的最後一段作可執行程序的名字.
每個目隻包含一個包, 因此每個可執行程序後者叫Unix語中的命令, 會要求放到一個獨立的目. 這些目有時候會放在名叫 cmd 目的子目彔下麫, 例如用於提供Go文檔服務的 golang.org/x/tools/cmd/godoc 命令 (§10.7.4).
每個目隻包含一個包, 因此每個可執行程序後者叫Unix語中的命令, 會要求放到一個獨立的目. 這些目有時候會放在名叫 cmd 目的子目録下面, 例如用於提供Go文檔服務的 golang.org/x/tools/cmd/godoc 命令 (§10.7.4).
每個包可以由它們的導入路徑指定, 就像前看到的那樣, 或者有一個相對目的路徑知道, 必鬚以 `.``..` 開頭. 如果沒有指定參數, 那默認指定當前的目. 下的命令用於構建一個包, 雖然它們的寫法各不相:
每個包可以由它們的導入路徑指定, 就像前看到的那樣, 或者有一個相對目的路徑知道, 必鬚以 `.``..` 開頭. 如果沒有指定參數, 那默認指定當前的目. 下的命令用於構建一個包, 雖然它們的寫法各不相:
```
$ cd $GOPATH/src/gopl.io/ch1/helloworld
@@ -34,7 +34,7 @@ $ go build src/gopl.io/ch1/helloworld
Error: cannot find package "src/gopl.io/ch1/helloworld".
```
也可以指定包的源文件列, 一般這隻用於構建一些小程序或臨時性的實驗. 如果是main包, 將以第一個Go源文件的基礎文件名作可執行程序的名字.
也可以指定包的源文件列, 一般這隻用於構建一些小程序或臨時性的實驗. 如果是main包, 將以第一個Go源文件的基礎文件名作可執行程序的名字.
```
$ cat quoteargs.go
@@ -53,22 +53,22 @@ $ ./quoteargs one "two three" four\ five
["one" "two three" "four five"]
```
是對於這類一次性的程序, 我們繫統盡快的構建併運行它. `go run` 命令結了構建和運行的兩個步驟:
是對於這類一次性的程序, 我們繫統盡快的構建併運行它. `go run` 命令結了構建和運行的兩個步驟:
```
$ go run quoteargs.go one "two three" four\ five
["one" "two three" "four five"]
```
第一行的參數列中第一個不是以 .go 結尾的將作可執行程序的參數運行.
第一行的參數列中第一個不是以 .go 結尾的將作可執行程序的參數運行.
默認情況下, `go build` 命令構建指定的包和它依賴的包, 然後丟棄所有除了最後的可執行文件之外的中間編譯結果. 依賴分析和編譯都是很快的, 但是隨着項目增加到幾十個包和成韆上萬行代碼, 依賴關繫分析和編譯時間的消耗將變的可觀, 可能需要幾秒種, 卽使這些依賴項沒有改變.
`go install` 命令和 `go build` 命令很相似, 但是它保存每個包的編譯成果, 而不是將它們都丟棄. 被編譯的包被保存到 $GOPATH/pkg 目下和 src 目對應, 可執行程序被保存到 $GOPATH/bin 目. (很多用戶將 $GOPATH/bin 添加到可執行程序的蒐索列中.) 還有, `go install` 命令和 `go build` 命令都不會重新編譯沒有生變化的包, 這可以使後續構建更快捷. 了方便, `go build -i` 將安裝每個目標所依賴的包.
`go install` 命令和 `go build` 命令很相似, 但是它保存每個包的編譯成果, 而不是將它們都丟棄. 被編譯的包被保存到 $GOPATH/pkg 目下和 src 目對應, 可執行程序被保存到 $GOPATH/bin 目. (很多用戶將 $GOPATH/bin 添加到可執行程序的蒐索列中.) 還有, `go install` 命令和 `go build` 命令都不會重新編譯沒有生變化的包, 這可以使後續構建更快捷. 了方便, `go build -i` 將安裝每個目標所依賴的包.
編譯對應不的操作繫統平颱和CPU架構, `go install` 會將編譯結果安裝到 GOOS 和 GOARCH 對應的目. 例如, 在 Mac 繫統 golang.org/x/net/html 包將被安裝到 $GOPATH/pkg/darwin_amd64 目下的 golang.org/x/net/html.a 文件.
編譯對應不的操作繫統平颱和CPU架構, `go install` 會將編譯結果安裝到 GOOS 和 GOARCH 對應的目. 例如, 在 Mac 繫統 golang.org/x/net/html 包將被安裝到 $GOPATH/pkg/darwin_amd64 目下的 golang.org/x/net/html.a 文件.
對不操作繫統或CPU的交叉構建也是很簡單的. 隻需要設置好目標對應的GOOS 和 GOARCH, 然後運行構建目卽可. 下交叉編譯的程序將輸齣它在編譯時操作繫統和CPU類型:
對不操作繫統或CPU的交叉構建也是很簡單的. 隻需要設置好目標對應的GOOS 和 GOARCH, 然後運行構建目卽可. 下交叉編譯的程序將輸齣它在編譯時操作繫統和CPU類型:
```Go
gopl.io/ch10/cross
@@ -78,7 +78,7 @@ func main() {
}
```
以64位和32位環境分執行程序:
以64位和32位環境分執行程序:
```
$ go build gopl.io/ch10/cross
@@ -89,13 +89,13 @@ $ ./cross
darwin 386
```
有些包可能需要對不平颱和處理器類型輸齣不版本的代碼, 以便於處理底層的可移植性問題或提供一些特點代碼提供優化. 如果一個文件名包含了一個操作繫統或處理器類型名字, 例如 net_linux.go 或 asm_amd64.s, Go工具將隻在對應的平颱編譯這些文件. 還有一個特的構建註釋註釋可以提供更多的構建控製. 例如, 文件中如果包含下的註釋:
有些包可能需要對不平颱和處理器類型輸齣不版本的代碼, 以便於處理底層的可移植性問題或提供一些特點代碼提供優化. 如果一個文件名包含了一個操作繫統或處理器類型名字, 例如 net_linux.go 或 asm_amd64.s, Go工具將隻在對應的平颱編譯這些文件. 還有一個特的構建註釋註釋可以提供更多的構建控製. 例如, 文件中如果包含下的註釋:
```Go
// +build linux darwin
```
在包聲明的前(含包的註釋), 告訴 `go build` 隻在對 Linux 或 Mac OS X 是纔編譯這個文件. 下的構建註釋示不編譯這個文件:
在包聲明的前(含包的註釋), 告訴 `go build` 隻在對 Linux 或 Mac OS X 是纔編譯這個文件. 下的構建註釋示不編譯這個文件:
```Go
// +build ignore