Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

สวัสดี Go module proxy

$
0
0

เห็นใน Go 1.13 beta 1 นั้นทำการกำหนดค่า default ของ GOPROXY ให้
จะวิ่งไปที่ https://proxy.golang.org และ direct (ออกไปยัง GitHub, bitbucket ตรง ๆ)
ที่สำคัญ สามารถใส่ comma(,) ได้ด้วย
นั่นคือกำหนด proxy ได้มากกว่า 1 นั่นเอง
ดังนั้นเรามาลองทำความรู้จักและใช้งานกันหน่อย

[gist id="e7a05d1cd0b32ea77ec94238345dae8a" file="4.txt"]

ทำไมต้องใช้ 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 ดูว่าทำงานอย่างไร ดังนี้

[gist id="e7a05d1cd0b32ea77ec94238345dae8a" file="main.go"]

จากนั้นทำการ run หรือ start ขึ้นมา จะทำการ port=8080 นะ

เมื่อเรียบร้อยแล้ว สร้างระบบงานตัวอย่าง
โดยระบบงานตัวอย่างจะใช้งาน module color

[gist id="e7a05d1cd0b32ea77ec94238345dae8a" file="demo.go"]

ทำการ run และดูผลที่เกิดขึ้น
อย่าลืมไปลบ $GOPATH/pkg/mod ด้วย
มิเช่นนั้นจะไม่เห็นผลการทำงานที่ฝั่ง proxy ที่สร้างไว้

[gist id="e7a05d1cd0b32ea77ec94238345dae8a" file="1.txt"]

แต่ถ้า run ด้วยการไม่กำหนด direct ไปใน GOPROXY 
จะได้ผลคือ  ไม่พบข้อมูลของ module ที่ใช้งานดังนี้

[gist id="e7a05d1cd0b32ea77ec94238345dae8a" file="2.txt"]

นั่นหมายความว่า proxy จะมีรูปแบบของไฟล์และ folder ตามที่กำหนดด้วย
ประกอบไปด้วย

  • List of version ถ้า go ไม่รู้ว่าเราต้องการ version อะไร
  • ไฟล์ .mod หรือ Module metadata
  • ไฟล์ go.mod ของ module นั้น ๆ
  • Zip file ของ module
[gist id="e7a05d1cd0b32ea77ec94238345dae8a" file="3.txt"]

น่าพอเห็นภาพแล้วว่า GOPROXY ต้อง implement อะไรบ้าง

ไว้ค่อยไปทำต่อไป น่าจะเห็นแนวทาง คิดว่า น่าจะมีคนทำไว้ให้เราใช้แน่ ๆ
ก็ไปเจอ Athens และ JFrog Go Registry

ยังไม่พอนะใน GOPROXY เราสามารถกำหนด path ตรง ๆ ได้เลย

ยกตัวอย่างเช่น

[code] $export GOPROXY=file://mypath/to/module1,file://mypath/to/module2 [/code]

น่าจะพอทำให้เห็นประโยชน์ของ GOPROXY กันบ้าง


Viewing all articles
Browse latest Browse all 1997

Trending Articles