Golang 配置不是這里要討論的新話題。但是在Go 1.12發(fā)布之后,我認為必須重新定義步驟,因為項目設(shè)置變得比以前簡單明了。
在搜索配置步驟時,除了少數(shù)文章之外,大部分內(nèi)容仍然是分享舊方式,即
- 設(shè)置GOPATH 環(huán)境變量
- 在GOPATH中創(chuàng)建項目以解析自定義包路徑。
- 使用Go dep或其他外部工具(如glide)維護依賴性
- 依賴包會安裝在同一工作區(qū)中。
通過本文,我們將看到項目設(shè)置及其發(fā)布如何在Go 1.12版本中進行。
在1.11版本中,Go引入了名為Go Modules的內(nèi)置包管理,它正在開始進行重大改變Go生態(tài)系統(tǒng)。它是GOPATH的替代品,集成了版本控制和軟件包分發(fā)支持。
來自Go博客,
在我們使用GOPATH的八年中,創(chuàng)建了大量的工具,假設(shè)Go源代碼存儲在GOPATH中。
遷移到Go模塊將是Go生態(tài)系統(tǒng)中影響最深遠的變化,因為Go 1.將整個生態(tài)系統(tǒng) - 代碼,用戶,工具等 - 從GOPATH轉(zhuǎn)換為模塊將需要在許多不同領(lǐng)域開展工作。
由于1.12版本的Go模塊默認啟用,GOPATH將在1.13版本中棄用。
對于那些開始使用Go 1.12的人來說,安裝和設(shè)置將如下所示。
安裝Go
在Mac上
brew install go
在Ubuntu上
curl -O https://dl.google.com/go/go1.12.4.linux-amd64.tar.gz
tar -xvf go1.9.3.linux-amd64.tar.gz
sudo mv go /usr/local
*從Go 1.8開始,將GOPATH設(shè)置為環(huán)境變量不是必需的。如果我們沒有設(shè)置一個,Go使用默認的GOPATH為 $HOME/go
構(gòu)建項目
讓我們在GOPATH之外的首選位置為go項目創(chuàng)建文件夾
注意: Go模塊在GOPATH中被禁用。所以我們不能在GOPATH位置內(nèi)部創(chuàng)建項目
$HOME/go
mkdir goapp1
cd goapp1
初始化模塊
使用Go模塊初始化項目名稱。
go mod init goapp1
這將創(chuàng)建模塊配置文件go.mod,其中包含模塊名稱和版本。

此go.mod文件定義Module的根,go命令將相應地與包一起使用,作為GOPATH的替代。
使用模塊
Go模塊主要解決以下用例,
- 用于獲取外部包的依賴關(guān)系管理。
- 解析自定義包作為GOPATH的替代。
- 包版本和發(fā)布
依賴管理
讓我們使用jsoniter設(shè)置簡單的json數(shù)據(jù)生成應用程序。
goapp.go
package main
import (
"fmt"
controllers "goapp1/handlers"
jsoniter "github.com/json-iterator/go"
)
type AppInfo struct {
Name string
}
func main() {
info := AppInfo{
Name: "GoApp",
}
jsonString, _ := jsoniter.Marshal(&info)
fmt.Println(string(jsonString))
}
該go.mod配置的工作通常喜歡gemfile用Ruby,requirement.txtPython中或其他依賴管理工具,但不完全是。
構(gòu)建go時,將根據(jù)go代碼中的import語句獲取最新版本的依賴項,并go.mod使用所需的依賴項更新配置。
go build
對于我們的示例,go build將獲取最新的jsoniter及其依賴項。
每次go.mod得更新,go build命令創(chuàng)建一個名為的文件,go.sum其中包含特定模塊版本內(nèi)容的預期加密校驗和。
go.sum不是鎖文件。它僅用于驗證目的。有關(guān)詳細信息,請參閱這里 FAQ。

欲了解更多依賴管理使用情況參見這里。
解決自定義包
讓我們創(chuàng)建一個自定義包并驗證它是否在沒有GOPATH的情況下得到解決。我創(chuàng)建了一個名為的包handlers
mkdir handlers
編寫一個函數(shù)
package controllers
import "fmt"
func ShowInfo() {
fmt.Println("controller modeule info")
}
使用main.go中的自定義包功能,
package main
import (
"fmt"
controllers "goapp1/handlers"
jsoniter "github.com/json-iterator/go"
)
type AppInfo struct {
Name string
}
func main() {
info := AppInfo{
Name: "GoApp",
}
jsonString, _ := jsoniter.Marshal(&info)
fmt.Println(string(jsonString))
controllers.ShowInfo()
}
現(xiàn)在go build解析沒有GOPATH的自定義包。二進制文件將在指定的模塊名稱中創(chuàng)建go.mod 。
讓我們執(zhí)行結(jié)果。

總結(jié)
模塊系統(tǒng)將幫助我們?yōu)镚o生態(tài)系統(tǒng)提供更好的身份驗證和構(gòu)建速度。