【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 rabbitmqgo 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