สรุปสั้น ๆ
“บทความนี้เราพาคู่หูเจ้าหนูโกแลง (Golang) ซึ่งเป็นภาษาที่ขึ้นชื่อในเรื่องของความเร็ว มาพร้อมกับตัวช่วยจอมพลังในการทำ CLIs แอปอย่างงูเห่า (Cobra) สองตัวนี้จะใช้งานคู่กันยังไงไปดู~”🦫
เขียนโดย
Sirasit Boonklang (Aeff)
Tech and Coding Consultant
บทความนี้ตีพิมพ์ และ เผยแพร่เมื่อ 20 มกราคม 2566
Cobra คืออิหยัง
Cobra เป็น Go-module จอมพลังที่จะมาช่วยให้การทำ command-line application ด้วยภาษา Go ง่ายขึ้น แถมยังเป็น open-source อีกด้วย โดยเจ้า Cobra ถูกสร้างโดย Steve Francia หรือที่รู้จักในชื่อ spf13 เป็น module ยอดฮิตที่เดฟโกแลงเลือกใช้ ตัวอย่างเช่น:
-
hugo อันนี้เค้าว่ากันว่าเป็น static site generator (SSG) ที่เร็วที่สุดในโลก
-
gh เป็น GitHub CLI ที่เป็นตัว official
-
kubectl ที่สาย kubernetes คุ้นเคยเพราะมันคือ Kubernetes CLI
โดยเจ้างูเห่าจอมพลังตัวนี้ มีฟีเจอร์เด็ด ๆ หลายตัว ที่จะทำให้สร้าง CLI แบบโค้ดคลีน ๆ ใช้งานง่าย
เดี๋ยวเราไปดูความสามารถและฟีเจอร์ต่าง ๆ ของเจ้างูเห่า cobra กันดีกว่าครับ ถ้าพร้อมแล้ว ปายย~
ฟีเจอร์หลักของ cobra
-
nested commands เราสามารถทำคำสั่งหรือ command line ต่าง ๆ ที่ยุ่งเหยิงมีความซับซ้อน แต่ยังใช้งานง่าย UX ดีได้ด้วยการซ้อนคำสั่ง
-
powerful flags เราสามารถสร้าง flags ที่สอดคล้องกับ POSIX ได้ทั้งแบบ particular command และ globally
-
โดย flags คือ อ็อบชันพิเศษที่ใช้ในการส่งพารามิเตอร์บางอย่างไปยัง command line ปกติ แฟล็กมักจะนำหน้าด้วย “-” หรือ “–” และมักใช้เพื่อเปิดหรือปิดฟีเจอร์หรือฟังก์ชันบางอย่าง ตัวอย่างเช่น ในคำสั่ง ls (ใช้เพื่อแสดงรายการเนื้อหาของไดเร็กทอรี) สามารถใช้แฟล็ก -l เพื่อแสดงไฟล์ในรูปแบบยาวที่มีรายละเอียดเพิ่มเติม
ls -l
-
ส่วน POSIX(Portable Operating System Interface) คือ มาตรฐานที่กำหนด API สำหรับโปรแกรมซอฟต์แวร์ที่ทำงานบนระบบปฏิบัติการ Unix และ Unix-like
-
-
customizable help แม้ว่า Cobra จะสร้างข้อความเมื่อเราใช้ help มาให้โดยอัตโนมัติ แต่เราสามารถแก้ไขข้อความต่าง ๆ ให้เป็นแบบของเราได้
-
shell auto-completion ฟีเจอร์นี้เรียกว่าไม่มีได้ เพราะมันมีประโยชน์มากเวลาที่เราพิมพ์ไปบางส่วนแล้วกด tab มันก็จะเติมป้อนคำสั่งโดยอัตโนมัติหรือแสดงรายการตัวเลือกอื่น ๆ ที่เป็นไปได้ ไม่ว่าผู้ใช้จะใช้ Bash, Zsh หรือแม้แต่ PowerShell ก็สามารถใช้ได้
Ref: https://www.thorsten-hans.com/lets-build-a-cli-in-go-with-cobra/
มาเริ่มทำ CLI ด้วย Go และ Cobra กัน
-
ก่อนอื่นต้องติดตั้ง Go ให้เรียบร้อยก่อนนะครับ สามารถดาวน์โหลดได้ที่ https://go.dev/dl/
-
ทำการ initialize project ด้วยคำสั่ง go mod init <พาทและชื่อของโปรเจกต์> เช่น go mod init github.com/<ชื่อ repo >/examples-cobra-golang
-
ติดตั้ง Cobra module ด้วยคำสั่ง go get -u github.com/spf13/cobra@latest
-
ติดตั้ง Cobra-CLI ด้วยคำสั่ง go install github.com/spf13/cobra-cli@latest
- เมื่อเราทำการติดตั้ง cobra-cli แล้วเราสามารถใช้คำสั่ง cobra-cli บน terminal ของเราได้
โดยวิธีใช้จะใช้คำสั่ง cobra-cli แล้วตามด้วย command ซึ่งหลัก ๆ จะมีที่ใช้ได้ 4 ตัว
-
add เป็นการเพิ่มคำสั่ง command อีกตัวที่เราสร้างเองเข้าไปในแอป CLI ของเรา
-
completion ใช้ในการสร้างสคริปต์ autocompletion สำหรับคำสั่งเฉพาะที่เราตั้ง
-
help ใช้เพื่อบอกข้อมูลว่าคำสั่งนั้นเอาไว้ใช้ทำอะไร และใช้ยังไง
-
init ใช้ในการเริ่มต้นสร้าง project cli app ด้วย cobra
หลังจากได้รู้จักกับคำสั่งต่าง ๆ ของ cobra-cli ไปแล้วมาลองใช้งานกันเริ่มต้นจาก
-
-
cobra-cli init ในการสร้างโปรเจกเริ่มต้น โดยเมื่อทำการใช้คำสั่ง cobra-cli init ไปแล้วจะได้โฟลเดอร์ cmd ที่มีไฟล์ root.go และไฟล์ main.go ที่มีโค้ดเริ่มต้นมาให้
สำหรับในไฟล์ main.go ที่ cobra สร้างขึ้นมาให้ จะมีคำสั่ง cmd.Execute() ในฟังก์ชัน main โดยคำสั่งนี้ใช้ในการรัน command และ subcommand โดยเมธอดนี้จะไม่มีอาร์กิวเมนต์และรีเทิร์นเออเร่อมา
ต่อมามาดูไฟล์ root.go ที่ cobra สร้างมาให้ ป็นไฟล์ต้นฉบับ ที่กำหนดคำสั่ง root command โดย root commad จะเป็นคำสั่งบนสุดใน tree command (เพราะมันสามารถเพิ่มคำสั่งอื่น ๆ หรือ subcommand เพิ่มไปได้เรื่อย ๆ) และโดยปกติจะเป็นคำสั่งที่ผู้ใช้เรียกใช้เมื่อรันโปรแกรมขึ้นมา
-
หากเราต้องการเพิ่มคำสั่งอื่น ๆ เราสามารถใช้ cobra-cli ช่วยสร้างไฟล์เริ่มต้นของคำสั่งได้โดยใช้คำสั่ง cobra-cli add <ชื่อคำสั่ง> เช่นต้องการสร้างคำสั่งสำหรับให้ทำงานฟังก์ชัน หาพื้นที่รอบวงกลม จะใช้เป็นคำสั่ง cobra-cli add find_area_circle
จากภาพนี้จะเห็นได้ว่ามีไฟล์ findAreaCircle.go ถูกสร้างขึ้นมาแล้ว เราสามารถปรับแต่งแก้ไขการทำงานเมื่อมีการใช้คำสั่งของ find_area_circle ได้ แต่ตอนนี้มันจะยังไม่สามารถคำนวณได้เพราะเรายังไม่ได้เขียนฟังก์ชันสำหรับหาค่าพื้นที่ของวงกลม
-
แต่เราจะมาแก้ไขจากไฟล์นี้ โดยสร้างฟังก์ชันหาพื้นที่ของวงกลมตามโค้ดด้านล่าง
-
หลังจากนั้น import package ที่เกี่ยวข้อง
-
ในส่วนของ Run: func(cmd *cobra.Command, args []string) {} ฟังก์ชันนี้จะทำการรับสองอาร์กิวเมนต์ cmd ที่เป็น pointer ของคำสั่งที่กำลังใช้งาน และ args ซึ่งเป็น slice (ชนิดข้อมูลที่เก็บข้อมูลได้หลายตัวคล้าย ๆ array แต่ไม่ต้องกำหนดขนาดของ slice ก่อน) โดย slice ของข้อความ ที่แสดงอาร์กิวเมนต์ที่ส่งไป command เราสามารถใส่ business logic การทำงานในตรงนี้ได้เลย
ส่วนนี้เราสามารถสร้างตัวแปร res มารับค่าที่ return มาจากฟังก์ชันหาพื้นที่วงกลมแล้วเอาไปคูณกับค่าพายหลังจากนั้นก็ทำการแสดงค่าผลลัพธ์ที่อยู่ใน res ออกมา
-
เมื่อเสร็จแล้วสามารถลองรันได้โดยใช้คำสั่ง go run main.go <คำสั่ง> ค่าที่ส่งไปผ่านอาร์กิวเมนต์ เช่น go run main.go findAreaCircle 10
-
เมื่อโปรแกรมสามารถทำงานได้แล้วเราก็สามารถ build เป็น binary file ได้เลยโดยใช้คำสั่ง go build .
-
เราก็จะได้ไฟล์ binary มาของผมใช้เป็น windows ก็จะได้มาเป็นไฟล์นามสกุล .exe นั้นเองเวลาที่เราเรียกใช้คำสั่ง .\<ชื่อไฟล์.exe> <คำสั่ง> <ค่าที่ต้องการหา> เช่น .\examples-cobra-golang.exe findAreaCircle 15
เท่านี้เราก็จะได้ CLIs Application อย่างง่ายแล้ว จะเห็นได้ว่าการใช้เจ้าตัว cobra-cli มาช่วยในจะทำให้เราลดงานที่ต้องทำซ้ำ ๆ สามารถสร้างคำสั่งและไฟล์ต่าง ๆ ได้อย่างง่ายดาย
มาสร้างตัวอย่าง Go Application อย่างง่าย ๆ กัน
- ไปที่ Visual Studio Code แล้วใช้คำสั่ง `go mod init ตามด้วยชื่อ module`
โดยคำสั่ง go mod init มันจะสร้างไฟล์ go.mod มาให้ แล้วการที่เราใส่ path ด้านหลังนั้นเพื่อให้จัดการ และ เรียกใช้ง่ายขึ้น เช่น เวลาที่ต้องการนำโปรเจกต์นี้ไปทำเป็น package ของตัวเองก็สามารถเรียกใช้จาก Github ได้เลย เจ้าไฟล์ go.mod มีหน้าที่เก็บพวกชื่อ package และเวอร์ชันของ package ต่าง ๆ ที่ใช้กับโค้ดเราและเวอร์ชัน Go ที่โค้ดเราใช้
- สร้างไฟล์ชื่อ main.go
- ต่อมาเราจะมาเขียนไฟล์ที่เป็นโค้ดการทำงานของภาษา Go โดยเริ่มจากสร้างไฟล์ main.go ที่เป็นไฟล์การทำงานหลักของภาษา Go (แต่จริง ๆ แล้วในการรัน Go สามารถตั้งชื่ออื่นนอกจาก main ก็รันได้นะ)เมื่อเรารู้จักกับไฟล์ main.go แล้วเราไปดูโค้ดตัวอย่างกันครับ
โค้ดนี้จะประกอบไปด้วย 4 ส่วน
3.1 ประกอบ package main ว่าเป็น package หลัก
3.2 ส่วนในการเรียกใช้งานโมดูลที่เกี่ยวข้อง ในโปรเจกต์นี้จะมี fmt (fmt มันย่อมาจาก formatted เป็น package เอาไว้เรียกใช้งานตัวจัดการ input และ output) และ net/http (เป็น package ที่มี HTTP Client และ Server มาให้ใช้ เราสามารถเรียกใช้ method Get, Head, Post และ PostForm ได้)
3.3 ฟังก์ชัน HelloServer
ฟังก์ชัน HelloServer รับพารามิเตอร์สองตัว ได้แก่ ResponseWriter และ Request ResponseWriter ใช้เพื่อรอรับ Responese และ HTTP Request โดยการทำงานในฟังก์ชันจะมีการใช้ fmt.Fprintf ถูกเรียกใช้ด้วย ResponseWriter (ในที่นี่อยู่ตัวแปร w) และตามด้วยข้อความ Hello และ %s ที่เอาไว้แสดงข้อมูลที่เป็น String โดยตอนนี้ข้อมูลที่จะมาแสดงนั้นเป็น Path ของ URL ของ Request
3.4 ฟังก์ชัน main ซึ่งจะเป็นฟังก์ชันการทำงานหลัก Go จะรันได้ต้องมีฟังก์ชัน main เท่านั้น โดยในฟังก์ชันนี้จะมีการเรียกใช้ แพ็คเกจ “net/http” ใช้ HTTP Client และ Server โดยฟังก์ชัน “http.HandleFunc” จะทำการ Register HandleFunc สำหรับกำหนดตัวจัดการ Request เข้ามาใน Path (“/”) และ ฟังก์ชัน “http.ListenAndServe” จะทำการเริ่มรัน HTTP Server ด้วย โดยในที่นี้จะใช้เป็นพอร์ต :8080
- หลังจากเขียนโค้ดเสร็จก็ลองรันกันน ด้วยคำสั่ง go run main.go
- หากเราต้องการให้ Hello แล้วตามด้วยข้อความเพิ่มเติม สามารถลองใส่ / แล้วตามด้วยข้อความเพิ่มไปได้ เช่น http://localhost:8080/Azure%20App%20Service
- เมื่อเรารันตัวอย่างได้แล้ว ต่อมาเป็นขั้นตอนการ Deploy หากใครยังไม่มี Azure Subscription แล้วต้องการทำตามบทความนี้ แอดก็เอาแหล่งในการ Activate Sandbox ของ Microsoft Learn ที่สามารถไปใช้ฟรี ๆ ได้ 4 ชั่วโมงสำหรับการทำแลปนี้ โดยไปที่ ลิงก์นี้ แล้วกด Activate Sandbox ได้เลย
- เมื่อ Sandbox ถูก Activate แล้วให้ไปที่ Visual Studio Code ดาวน์โหลด Azure App Service extension มา
- แล้วไปที่ Azure App Service extension แล้วคลิกขวา เลือก Create New Web App
- ทำการตั้งชื่อเว็บแอป โดยชื่อนี้จะไปอยู่ใน URL ด้วยนะ
- เลือก Runtime เป็น Go ตอนนี้จะมีให้เลือก 2 เวอร์ชัน คือ 1.19 และ 1.18
- Plan หรือ ระดับของบริการ หากใครต้องการแพลนฟรี สำหรับ Dev/Test ให้เลือกเป็น F1
- เมื่อ Azure App Service ของเราสร้างเสร็จแล้ว สร้างคลิกขวาที่ App Service ของเราแล้วกด Deploy to Web App ..
- เลือกโฟลเดอร์ที่ต้องการจะ Deploy แล้วกด Deploy ได้เลย
สำหรับขั้นตอนในการ Deploy เราสามารถมาดู Log ระหว่าง Deploy ได้ที่ OUTPUT ด้านล่าง
เมื่อการ deployment completed แล้วให้ไปที่ App Service ของเรา คลิกขวาแล้วกด Browse Website ได้เลย
เพิ่งเท่านี้เราก็สามารถเอาเว็บตัวอย่างของเรา Deploy ขึ้นไปบน Azure App Service ได้แล้ว เย้ 🎉
หากใครที่จะเริ่มต้นเรียนรู้ภาษา Go และเรียนรู้การใช้งาน Azure App Service อยากจะบอกดังๆว่า เรามีคอร์สฟรีที่ไม่ควรพลาด
ระบบฝึกทักษะ การเขียนโปรแกรม
ที่พร้อมตรวจผลงานคุณ 24 ชั่วโมง
- โจทย์ปัญหากว่า 200 ข้อ ที่รอท้าทายคุณอยู่
- รองรับ 9 ภาษาโปรแกรมหลัก ไม่ว่าจะ Java, Python, C ก็เขียนได้
- ใช้งานได้ฟรี ! ครบ 20 ข้อขึ้นไป รับ Certificate ไปเลย !!