สำหรับคนที่เพิ่งจะเริ่มเขียน Go ก็คงจะต้องเล่าประวัติให้รู้คร่าวๆสักหน่อย ว่าทำไมเราถึงจะต้องมีไฟล์ go.mod และมันมีที่มาอย่างไร
เริ่มตั้งแต่ go ออกเวอร์ชั่น 1 เมื่อปี 2009 ในสมัยนั้นเราไม่มี go.mod ใช้กันนะครับ แต่ตอนนั้นเราใช้วิธีเก็บพวก lib ต่างๆที่เราจะใช้ไว้ใน directory ที่เราเรียกว่า GOPATH
ซึ่ง ณ วันนี้ถ้าเราใช้คำสั่ง
go env
เราก็จะยังคงเห็นค่า GOPATH
นี้อยู่เหมือนเดิม เพียงแค่วิธีบริหารจัดการของข้างในมันเปลี่ยนไป แต่ก็ยังคงใช้เพื่อเก็บ lib ต่างๆที่เรา import เข้ามาจากภายนอกมารวมไว้ในนี้ ซึ่งใน default ค่า GOPATH จะอยู่ที่ $HOME/go
หรือ ~/go
*หมายเหตุ: ~
เครื่องหมายนี้หมายถึง home directory ของเราเองเช่น /Users/pallat
เป็นต้น
แต่เดิมนั้น เวลาเราใช้คำสั่ง
go get
เช่น
go get github.com/gin-gonic/gin
สิ่งที่เกิดขึ้นก่อนที่จะมี module ก็คือ Go จะไป git clone สิ่งที่ get ลงมาไว้ใน $GOPATH/pkg
ตรงๆเช่นกรณีนี้ ก็จะได้ directory ใหม่หน้าตาประมาณนี้
~/go/pkg/github.com/gin-gonic/gin
ซึ่งในสมัยนั้น เราก็จะประสบภัยเรื่อง version ตีกัน เช่นถ้าเราเขียนโปรแกรมแล้วต้องการใช้ lib A version 1 ในขณะที่เราก็ใช้ lib B version 2 ซึ่งถ้า lib B มีการไปเรียก lib A แต่เป็น version 2 ทีนี้มันก็จะไปเอา lib A version 2 มาทับ แล้วโปรแกรมเราก็จะใช้ไม่ได้ งงไหมครับ 😅
นั่นแหล่ะครับ ในยุคนั้นเราก็เลยเห็นตัวช่วยพากันออกมาให้เราเลือกใช้หลายตัว เช่น glide หรือ dep เป็นต้น โดยมีหลายตัวที่เลือกใช้วิธีจัดการผ่าน directory ที่ชื่อว่า vendor
ซึ่ง go กำหนดให้สามารถใช้ directory นี้เป็นที่เก็บ lib เฉพาะของ repo นั้นๆได้เอง ซึ่งจะทำให้แต่ละ repo เลือกใช้ lib version ที่ต้องการได้เอง แต่ก็ยังแก้ปัญหา version ไม่ตรงกันในกรณีที่ lib แต่ละตัวไปใช้ lib ตัวเดียวกันต่าง version กันไม่ได้อยู่ดี
ซึ่งในปี 2018 เดือน Feb Russ Cox ก็ได้เสนอ proposal เรื่องการจัดการ Go versioning ขึ้นมาและทดลองใช้ในชื่อว่า vgo
ก่อนที่จะ bundle เข้าไปใน Go1.11 ที่ออกมาวันที่ 24/08/2018 และในช่วงนั้นเราสามารถเปิด/ปิด feature นี้ได้ผ่านค่า GO111MODULE
โดยกำหนดค่าได้ 3 ค่าคือ on/off/auto
ซึ่งต้องบอกก่อนว่า ในสมัยก่อนหน้านั้น เวลาเราจะเขียนโค้ด Go เราจะต้องไปเขียนกันใน $GOPATH/src นะครับ ไม่อย่างนั้นเราจะไม่เห็นพวก lib ต่างๆ ซึ่งสิ่งนี้จะสัมพันธ์กับค่า auto
ที่จะกำหนดให้ GO111MODULE
ว่าถ้าเราให้เป็น auto หมายความว่า ถ้าเราไปเขียนโค้ดใน $GOPATH/src
เหมือนเดิม เราก็จะไม่ได้ใช้ Go Module ช่วยจัดการ versioning ให้ แต่ถ้าไปเขียนโค้ดไว้ที่อื่น เราก็จะต้องใช้ Go Module มาช่วยนั่นเอง
ก็จบแล้วนะครับ เป็นการเล่าประวัติคร่าวๆให้ได้รู้กันเล็กน้อยว่าเราเริ่มใช้ go.mod กันมาเมื่อไร อารมณ์เล่าความหลังให้ฟังกันครับ
Top comments (0)