หลังจากที่ Go 1.11 beta 2 ถูกปล่อยออกมาให้ลองใช้งานกัน
ซึ่งตัวเต็ม ๆ จะปล่อยมาในเดือนสิงหาคมนี้
feature ที่น่าสนใจคือ Go Module
จาก go get -> vendor -> vgo -> go mod ใน Go 1.11
ดูเอกสารเพิ่มเติมได้ที่ Release Note
มาเริ่มต้นใช้งานกันหน่อย
$cd $GOPATH/src/module_name $go mod -init go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'
ทำการเปิด Go module feature ด้วยคำสั่ง
$export GO111MODULE=on
ทำการสร้างไฟล์ go.mod สำหรับอธิบาย module
$go mod -init go: creating new go.mod: module main
จากนั้นก็ทำการแก้ไขไฟล์ go.mod เพื่อระบุ dependency ที่ใช้งานดังนี้
ทำการ build ระบบ จะทำการ download dependency ที่กำหนดไว้ใน go.mod ดังนี้
$go build go: downloading github.com/gin-gonic/gin v1.1.4 go: finding github.com/manucorporat/sse latest go: finding github.com/mattn/go-isatty v0.0.3 go: finding github.com/golang/protobuf/proto latest go: finding golang.org/x/net/context latest go: finding gopkg.in/go-playground/validator.v8 v8.18.2 go: finding gopkg.in/yaml.v2 v2.2.1 go: finding golang.org/x/net latest go: downloading golang.org/x/net v0.0.0-20180724234803-3673e40ba225 go: downloading github.com/mattn/go-isatty v0.0.3 go: downloading github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739 go: downloading gopkg.in/go-playground/validator.v8 v8.18.2 go: downloading gopkg.in/yaml.v2 v2.2.1 go: finding github.com/golang/protobuf v1.1.0 go: downloading github.com/golang/protobuf v1.1.0 go: finding gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405
สิ่งที่น่าสนใจคือ เรื่องของ version
การตั้งชื่อของ version ต้องเป็นไปตาม semantically versioned
นั่นคือมีรูปแบบดังนี้ v(major).(minor).(patch) เสมอ
ดังนั้นถ้า dependency ใด ไม่มี version ตามนี้จะไม่สามารถใช้งานได้
ยกตัวอย่างเช่น go-gin นั้น version ล่าสุดคือ v2.0
ดังนั้นจึงไม่สามารถกำหนดใน go.mod ได้
จะเกิด error ดังนี้
go.mod:4: invalid module version "v2.0": no matching versions for query "v2.0"
ถ้าต้องการ update depedency ใหม่ทั้งหมด
ใช้คำสั่งดังนี้
$go mod -sync go: downloading gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 go: finding github.com/stretchr/testify/assert latest go: finding golang.org/x/sync/errgroup latest go: finding gopkg.in/go-playground/assert.v1 v1.2.1 go: finding golang.org/x/sync latest go: downloading golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f go: finding golang.org/x/sys/unix latest go: downloading gopkg.in/go-playground/assert.v1 v1.2.1 go: finding golang.org/x/sys latest go: downloading golang.org/x/sys v0.0.0-20180724212812-e072cadbbdc8 go: finding github.com/stretchr/testify v1.2.2 go: downloading github.com/stretchr/testify v1.2.2 go: finding github.com/pmezard/go-difflib/difflib latest go: finding github.com/davecgh/go-spew/spew latest go: finding github.com/davecgh/go-spew v1.1.0 go: downloading github.com/davecgh/go-spew v1.1.0 go: finding github.com/pmezard/go-difflib v1.0.0 go: downloading github.com/pmezard/go-difflib v1.0.0
คำสั่งอื่น ๆ ของ go mod ประกอบไปด้วย
$go mod -sync $go mod -fmt #go fmt สำหรับไฟล์ go.mod และ go.sum $go mod -fix #จัดการไฟล์ go.mod $go mod -graph #สำหรับดู depedency ทั้งหมดที่ใช้งาน
ยังไม่พอนะ ถ้ายังต้องทำการส่งมอบในรูปแบบ vendor นั่นคือสร้าง vendor folder ขึ้นมาในระบบ
แน่นอนว่า Go Module ยังสนับสนุนด้วยคำสั่ง
$go mod -vendor
มาดูในไฟล์ go.mod กันดูบ้าง
โดยที่ require นั้นจะมี comment indirect มาให้
เป็นการบอกว่าคือ depedency ที่เราไม่ได้กำหนด
แต่ว่าต้องใช้งานจาก depedency ที่เรากำหนดนั่นเอง
แต่ไม่ใช่มีแค่ require นะ ยังมี exclude และ replace อีกด้วย
อยากรู้มากขึ้นไปดูที่
$go help modules
เพียงเท่านี้น่าจะพอทำให้เข้าใจมากขึ้นสำหรับ Go Module มากขึ้น
ว่าแล้วไปสร้าง Module และใช้งานกัน