เห็นใน Go 1.13 beta 1 นั้นทำการกำหนดค่า default ของ GOPROXY ให้
จะวิ่งไปที่ https://proxy.golang.org และ direct (ออกไปยัง GitHub, bitbucket ตรง ๆ)
ที่สำคัญ สามารถใส่ comma(,) ได้ด้วย
นั่นคือกำหนด proxy ได้มากกว่า 1 นั่นเอง
ดังนั้นเรามาลองทำความรู้จักและใช้งานกันหน่อย
ทำไมต้องใช้ GOPROXY ด้วย ?
โดยค่าปกตินั้น Go module นั้น
จะทำการตรวจสอบ module/dependency ที่ใช้
ใน $GOPATH/pkg/mod
ถ้าไม่เจอจะไปที่ github, gitlab, bitbucket และอื่น ๆ ก็ว่าไป
ปัญหาคือ
ถ้าออก internet ไม่ได้จะทำอย่างไร ?
ยิ่งในโลกของ container ยิ่งลำบากเพราะว่า
ต้องทำการ download module/dependency มาตลอด
เพราะว่าต้องทำการ build ใหม่ตลอด
หรือแก้ไขด้วยการทำ caching ใน container เอาอีก
ซึ่งดูลำบาก
ยิ่งการ scale ทีมหรือ project ก็ยิ่งยาก
ดังนั้นทางทีม Go จึงสร้าง GOPROXY ขึ้นมา
เพื่อแก้ไขปัญหาต่าง ๆ เหล่านี้ นั่นคือ
ให้เราสามารถสร้าง GOPROXY ได้เอง
เพื่อทำการเก็บ cached ของ module ต่าง ๆ ที่ download มาไว้
ทำให้ไม่ต้องทำการ download ใหม่ทุก ๆ ครั้ง
แสดงดังรูป
อยากรู้ว่าการทำงานของ GOPROXY เป็นอย่างไร ?
ว่าแล้วก็เขียน code ด้วยภาษา Go แบบง่าย ๆ
เพื่อ tracking ดูว่าทำงานอย่างไร ดังนี้
จากนั้นทำการ run หรือ start ขึ้นมา จะทำการ port=8080 นะ
เมื่อเรียบร้อยแล้ว สร้างระบบงานตัวอย่าง
โดยระบบงานตัวอย่างจะใช้งาน module color
ทำการ run และดูผลที่เกิดขึ้น
อย่าลืมไปลบ $GOPATH/pkg/mod ด้วย
มิเช่นนั้นจะไม่เห็นผลการทำงานที่ฝั่ง proxy ที่สร้างไว้
แต่ถ้า run ด้วยการไม่กำหนด direct ไปใน GOPROXY
จะได้ผลคือ ไม่พบข้อมูลของ module ที่ใช้งานดังนี้
นั่นหมายความว่า proxy จะมีรูปแบบของไฟล์และ folder ตามที่กำหนดด้วย
ประกอบไปด้วย
- List of version ถ้า go ไม่รู้ว่าเราต้องการ version อะไร
- ไฟล์ .mod หรือ Module metadata
- ไฟล์ go.mod ของ module นั้น ๆ
- Zip file ของ module
น่าพอเห็นภาพแล้วว่า GOPROXY ต้อง implement อะไรบ้าง
ไว้ค่อยไปทำต่อไป น่าจะเห็นแนวทาง คิดว่า น่าจะมีคนทำไว้ให้เราใช้แน่ ๆ
ก็ไปเจอ Athens และ JFrog Go Registry
ยังไม่พอนะใน GOPROXY เราสามารถกำหนด path ตรง ๆ ได้เลย
ยกตัวอย่างเช่น
[code] $export GOPROXY=file://mypath/to/module1,file://mypath/to/module2 [/code]น่าจะพอทำให้เห็นประโยชน์ของ GOPROXY กันบ้าง