DEV Community

Pallat Anchaleechamaikorn
Pallat Anchaleechamaikorn

Posted on

go.mod มีที่มาอย่างไร

สำหรับคนที่เพิ่งจะเริ่มเขียน Go ก็คงจะต้องเล่าประวัติให้รู้คร่าวๆสักหน่อย ว่าทำไมเราถึงจะต้องมีไฟล์ go.mod และมันมีที่มาอย่างไร

เริ่มตั้งแต่ go ออกเวอร์ชั่น 1 เมื่อปี 2009 ในสมัยนั้นเราไม่มี go.mod ใช้กันนะครับ แต่ตอนนั้นเราใช้วิธีเก็บพวก lib ต่างๆที่เราจะใช้ไว้ใน directory ที่เราเรียกว่า GOPATH ซึ่ง ณ วันนี้ถ้าเราใช้คำสั่ง

go env
Enter fullscreen mode Exit fullscreen mode

เราก็จะยังคงเห็นค่า GOPATH นี้อยู่เหมือนเดิม เพียงแค่วิธีบริหารจัดการของข้างในมันเปลี่ยนไป แต่ก็ยังคงใช้เพื่อเก็บ lib ต่างๆที่เรา import เข้ามาจากภายนอกมารวมไว้ในนี้ ซึ่งใน default ค่า GOPATH จะอยู่ที่ $HOME/go หรือ ~/go

*หมายเหตุ: ~ เครื่องหมายนี้หมายถึง home directory ของเราเองเช่น /Users/pallat เป็นต้น

แต่เดิมนั้น เวลาเราใช้คำสั่ง

go get
Enter fullscreen mode Exit fullscreen mode

เช่น

go get github.com/gin-gonic/gin
Enter fullscreen mode Exit fullscreen mode

สิ่งที่เกิดขึ้นก่อนที่จะมี 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)