หลังจากที่
Go 1.11 beta 2 ถูกปล่อยออกมาให้ลองใช้งานกัน
ซึ่งตัวเต็ม ๆ จะปล่อยมาในเดือนสิงหาคมนี้
feature ที่น่าสนใจคือ Go Module
จาก go get -> vendor -> vgo -> go mod ใน Go 1.11
ดูเอกสารเพิ่มเติมได้ที่
Release Note
มาเริ่มต้นใช้งานกันหน่อย
[code]
$cd $GOPATH/src/module_name
$go mod -init
go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'
[/code]
ทำการเปิด Go module feature ด้วยคำสั่ง
[code]
$export GO111MODULE=on
[/code]
ทำการสร้างไฟล์ go.mod สำหรับอธิบาย module
[code]
$go mod -init
go: creating new go.mod: module main
[/code]
จากนั้นก็ทำการแก้ไขไฟล์ go.mod เพื่อระบุ dependency ที่ใช้งานดังนี้
[gist id="d222f569f58259b7f1e76f7bbbfc0d48" file="go.mod"]
ทำการ build ระบบ จะทำการ download dependency ที่กำหนดไว้ใน go.mod ดังนี้
[code]
$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
[/code]
สิ่งที่น่าสนใจคือ เรื่องของ version
การตั้งชื่อของ version ต้องเป็นไปตาม
semantically versioned
นั่นคือมีรูปแบบดังนี้
v(major).(minor).(patch) เสมอ
ดังนั้นถ้า dependency ใด ไม่มี version ตามนี้จะไม่สามารถใช้งานได้
ยกตัวอย่างเช่น go-gin นั้น version ล่าสุดคือ v2.0
ดังนั้นจึงไม่สามารถกำหนดใน go.mod ได้
จะเกิด error ดังนี้
[code]
go.mod:4: invalid module version "v2.0": no matching versions for query "v2.0"
[/code]
ถ้าต้องการ update depedency ใหม่ทั้งหมด
ใช้คำสั่งดังนี้
[code]
$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
[/code]
คำสั่งอื่น ๆ ของ go mod ประกอบไปด้วย
[code]
$go mod -sync
$go mod -fmt #go fmt สำหรับไฟล์ go.mod และ go.sum
$go mod -fix #จัดการไฟล์ go.mod
$go mod -graph #สำหรับดู depedency ทั้งหมดที่ใช้งาน
[/code]
ยังไม่พอนะ ถ้ายังต้องทำการส่งมอบในรูปแบบ vendor นั่นคือสร้าง vendor folder ขึ้นมาในระบบ
แน่นอนว่า Go Module ยังสนับสนุนด้วยคำสั่ง
$go mod -vendor
มาดูในไฟล์ go.mod กันดูบ้าง
[gist id="d222f569f58259b7f1e76f7bbbfc0d48" file="go.mod-2"]
โดยที่ require นั้นจะมี comment indirect มาให้
เป็นการบอกว่าคือ depedency ที่เราไม่ได้กำหนด
แต่ว่าต้องใช้งานจาก depedency ที่เรากำหนดนั่นเอง
แต่ไม่ใช่มีแค่ require นะ ยังมี exclude และ replace อีกด้วย
อยากรู้มากขึ้นไปดูที่
[code]
$go help modules
[/code]
เพียงเท่านี้น่าจะพอทำให้เข้าใจมากขึ้นสำหรับ Go Module มากขึ้น
ว่าแล้วไปสร้าง Module และใช้งานกัน