Zam Huang
3 min readSep 1, 2019

【Golang】還在把 library 放在專案裡?該跟上使用 Go Module 了!

前言

Golang 在 1.11 開始就推出了 Go Module,如果你才剛開始使用 Golang,建議直接使用 Go Module,才不會被 GOPATH 搞的滿頭包。本篇先以初始專案視角介紹,如果要從舊的轉變成 Go Module 請參考:Migrate to go module

怎麼開始?以下為簡易教學

首先創一個 project

mkdir -p ~/workspace/rabbitmq/cmd
touch ~/workspace/rabbitmq/cmd/main.go

程式碼 main.go

package mainimport (
"fmt"
)
func main() {
fmt.Println("hello world")
}

Build project

cd ~/workspace/rabbitmq
go mod init rabbitmq
go get github.com/streadway/amqp
go build -o ./bin/rabbitmq ./cmd

常用的指令與使用說明

Module init

這個會在資料夾底下產生一個初始的 go.mod 檔案

go mod init [module]

成功的話會產出 go.mod,假如 [module] 填入的是 rabbitmq,產出的 go.mod 會長這樣

// go.mod
module rabbitmq
go 1.12

如果你忘記設定 [module],則會看到這個錯誤

go: cannot determine module path for source directory /Users/Zam/Documents/workspace/medium/rabbitmq (outside GOPATH, no import comments)

Module download

這個會將 go.mod 定義的 library 都下載下來,但基本上 go build, go test 也會自動下載 library 並新增到 go.mod 上,並會產出 go.sum 來確保 library 是否有更新。可以說能達到一樣的效果

go mod download

如果你忘了 import ,則會出現以下的錯誤

// github.com/streadway/amqpgo build -o ./bin/rabbitmq ./cmd 

# rabbitmq/cmd
cmd/main.go:16:15: undefined: amqp
cmd/main.go:41:4: undefined: amqp

Module add/update

這個指令會新增或更新你的 library 到 go.mod 。要新增的話也可以直接透過在程式裡面加 import,但是如果你的 IDE 好一點,還沒用到之前都會被格式化移除,但這通常用在讓舊專案採用 go module ,因此還是建議用以下的方式

go get [library]

Module tidy

移除在 go.mod 不需要的 library

go mod tidy 

Module list

印出 module 正在使用的所有 library

go list -m all

References

Zam Huang

一個記錄著自己人生過程的工程師。A Software Engineer at Ruckus Network in Taiwan。 IG, Linkedin:@zam_huang, stack overflow: user:2613194