使用Go Module構(gòu)建項目

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。

image.png

欲了解更多依賴管理使用情況參見這里。


解決自定義包

讓我們創(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é)果。

image.png

總結(jié)

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容