首頁 >後端開發 >Golang >go module是什麼?怎麼用? (附使用範例)

go module是什麼?怎麼用? (附使用範例)

藏色散人
藏色散人轉載
2022-01-12 16:02:395472瀏覽

本文由golang教學專欄跟大家介紹關於go module的使用方法,希望對需要的朋友有幫助!

go module 使用

go module 在go 1.14 版本之後推出

一、go module 使用介紹

go module 是Go1.11版本之後官方推出的版本管理工具,並且從Go1.13版本開始,go module將是Go語言預設的依賴管理工具。

1.1 GO111MODULE

要啟用go module支援首先要設定環境變數GO111MODULE,透過它可以開啟或關閉模組支持,它有三個可選值:offonauto,預設值是auto

  • GO111MODULE=off停用模組支持,編譯時會從GOPATHvendor資料夾中尋找套件。

  • GO111MODULE=on啟用模組支持,編譯時會忽略GOPATHvendor資料夾,只根據go.mod下載依賴,將依賴下載至%GOPATH%/pkg/mod/ 目錄下。

  • GO111MODULE=auto,當專案在$GOPATH/src外且專案根目錄有go.mod文件時,開啟模組支援。

簡單來說,設定GO111MODULE=on之後就可以使用go module了,以後就沒有必要在GOPATH中建立專案了,並且還能夠很好的管理專案依賴的第三方包資訊。

使用 go module 管理依賴後會在專案根目錄下產生兩個檔案go.modgo.sum

1.2 GOPROXY

Go1.11之後設定GOPROXY指令為:

export GOPROXY=https://goproxy.cn

Go1.13之後GOPROXY預設值為https:/ /proxy.golang.org,在國內是無法存取的,所以我十分建議大家設定GOPROXY,這裡我推薦使用goproxy.cn。

go env -w GOPROXY=https://goproxy.cn,direct

1.3 go mod指令

常用的go mod指令如下:

go mod download    下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit        编辑go.mod文件
go mod graph       打印模块依赖图
go mod init        初始化当前文件夹, 创建go.mod文件
go mod tidy        增加缺少的module,删除无用的module
go mod vendor      将依赖复制到vendor下
go mod verify      校验依赖
go mod why         解释为什么需要依赖

1.4 go.mod

#go.mod檔案記錄了專案所有的依賴訊息,其結構大致如下:

module github.com/Q1mi/studygo/blogger

go 1.12

require (
    github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
    github.com/gin-gonic/gin v1.4.0
    github.com/go-sql-driver/mysql v1.4.1
    github.com/jmoiron/sqlx v1.2.0
    github.com/satori/go.uuid v1.2.0
    google.golang.org/appengine v1.6.1 // indirect
)

其中,

  • #module用來定義套件名稱
  • require用來定義依賴套件及版本
  • indirect表示間接引用

1.4.1 依賴的版本

go mod支援語意化版本號,例如go get foo@v1.2.3,也可以跟git的分支或tag,例如go get foo@master,當然也可以跟git提交哈希,例如go get foo@e3702bed2。關於依賴的版本支援以下幾種格式:

gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
gopkg.in/vmihailenco/msgpack.v2 v2.9.1
gopkg.in/yaml.v2 <=v2.2.1
github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3e
latest

1.4.2 replace

在國內存取golang.org/x的各個包都需要翻牆,你可以在go.mod中使用replace替換成github上對應的函式庫。

replace (
    golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
    golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
    golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)

1.5 go get

在專案中執行go get指令可以下載依賴包,也可以指定下載的版本。

  1. 執行go get -u將會升級到最新的次要版本或修訂版本(x.y.z, z是修訂版本號, y是次要版本號)
  2. 運行go get -u=patch將會升級到最新的修訂版本
  3. #運行go get package@version將會升級到指定的版本號version

如果下載所有依賴可以使用go mod download指令。

1.6 整理依賴

我們在程式碼中刪除依賴程式碼後,相關的依賴函式庫並不會在go.mod檔案中自動移除。這種情況下我們可以使用go mod tidy指令來更新go.mod中的依賴關係。

1.7 go mod edit

格式化

因為我們可以手動修改go.mod文件,所以有些時候需要格式化該文件。 Go提供了一下指令:

go mod edit -fmt

新增依賴項

go mod edit -require=golang.org/x/text

移除依賴項

如果只是想修改go.mod檔案中的內容,那麼可以執行go mod edit -droprequire=package path,例如要在go.mod中移除golang.org/x/text包,可以使用以下命令:

go mod edit -droprequire=golang.org/x/text

關於go mod edit的更多用法可以透過go help mod edit查看。

1.8 在專案中使用go module

1.8.1 既有項目

如果需要對一個已經存在的項目啟用go module,可以請依照下列步驟操作:

  1. 在專案目錄下執行go mod init,產生一個go.mod檔。
  2. 執行go get,尋找並記錄目前專案的依賴,同時產生一個go.sum記錄每個依賴函式庫的版本和雜湊值。

1.8.2 新項目

對於一個新建立的項目,我們可以在專案資料夾下依照下列步驟操作:

  1. 执行go mod init 项目名命令,在当前项目文件夹下创建一个go.mod文件。
  2. 手动编辑go.mod中的require依赖项或执行go get自动发现、维护依赖。

二、包和调用文件在同一项目下

例如:

moduledemo
├── go.mod
├── main.go
└── mypackage
    └── mypackage.go  // package mp 定义包名为 mp

步骤:

1.在项目下创建一个 go.mod 文件,文件名只能为这个。

2.在 go.mod 文件中添加以下代码

module moduledemo  // 设定 moduledemo 为包根目录名,可以随意改变该名字,只需要导入时一致就好
go 1.14  // 表明版本

3.导入想要的包文件

import "moduledemo/mypackage"  // 这里是导入包目录下的包文件名

4.使用包文件

mp.MyPackage()  // 使用包中的 MyPackage() 函数

三、包和被调用文件不在同一个项目下

例如:

├── moduledemo
│   ├── go.mod
│   └── main.go
└── mypackage
    ├── go.mod
    └── mypackage.go  // package mp 定义包名为 mp

步骤

1.在 mypackage 下面创建 go.mod 文件,并添加以下代码

module mypackage

go 1.14

2.在 moduledemo 下面创建 go.mod 文件,并添加以下代码

module moduledemo

go 1.14


require mypackage v0.0.0  // 这个会在你执行 go build 之后自动在该文件添加
replace mypackage => ../mypackage  // 指定需要的包目录去后面这个路径中寻找

3.导入和使用

import "mypackage"  // 因为该包目录本身就是包文件所以无需添加下一级路径

mp.MyPackage()  // 使用包中的 MyPackage() 函数

以上是go module是什麼?怎麼用? (附使用範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除