การใช้ Makefile ภาษา GO
ในบทความนี้ เราจะมาดูกันว่าคุณในฐานะนักพัฒนา Go สามารถใช้ประโยชน์จากเทคโนโลยีอันยอดเยี่ยมที่ชื่อว่า Makefiles ซึ่งมีไว้เพื่อเพิ่มความสะดวกในการพิมพ์ command line ยาวๆที่ต้องใช้งานซ้ำๆ บ่อยๆ สำหรับพัฒนาแอปพลิเคชั่น Go ของคุณเอง
Makefiles คืออะไร?
มาเริ่มด้วยการดูว่า Makefiles คืออะไรก่อน Makefiles เป็นเครื่องมืออัตโนมัติที่มีประโยชน์อย่างเหลือเชื่อที่คุณสามารถใช้เพื่อรันและสร้างไม่ใช่แค่แอปพลิเคชัน Go ของคุณ แต่สำหรับภาษาการเขียนโปรแกรมส่วนใหญ่
โดยทั่วไป คุณจะเห็น Makefiles ที่ไดเร็กทอรีรากของโฮสต์ทั้งหมดของแอปพลิเคชัน Go ที่แตกต่างกันบน Github และใน Gitlab เนื่องจากมีการใช้อย่างกว้างขวางเป็นเครื่องมือทางเลือกสำหรับงานอัตโนมัติที่ผู้ดูแลแอปพลิเคชันเหล่านี้พบว่าตัวเองทำอยู่บ่อยครั้ง
ตัวอย่างง่ายๆ
ตอนนี้เราได้กล่าวถึงแนวคิดพื้นฐานแบบสัมบูรณ์แล้ว เรามาดูแนวคิดเหล่านี้ในเชิงปฏิบัติด้วย Makefile ตัวอย่างง่ายๆ ที่กระตุ้นความอยากรู้ของเรา
สร้างไดเร็กทอรีใหม่ที่คุณสามารถทำงานในไดเร็กทอรีนี้ และภายในไดเร็กทอรีนี้ ให้สร้างไฟล์ใหม่ชื่อ Makefile
เมื่อคุณมีสิ่งนี้ Makefile แล้ว ให้เปิดมันขึ้นมาแล้วมาเพิ่มการ target เรียก hello นี้จาก Makefile กัน เมื่อดำเนินการเป้าหมายนี้ จะเรียกใช้สคริปต์ด้านล่าง ซึ่งคล้ายกับฟังก์ชันปกติในแง่ของการเขียนโปรแกรม
hello:
echo "Hello"
โดยเวลาเรียกใช้งานก็แค่พิมพ์ make นำหน้า
make hello
จะได้ผลลัพธ์ดังนี้
echo "Hello"
"Hello"
ติดตั้ง Make บน Windows โดยใช้ Winget
Make เป็นเป้าหมายสำหรับแอปพลิเคชันที่เป็นไปตามหลักการของซอฟต์แวร์โอเพ่นซอร์สและฟรี (FOSS) เดิมทีได้รับการออกแบบมาให้ทำงานบนระบบ Linux เท่านั้น ซอร์สโค้ดสามารถแก้ไขได้ในแบบที่เราต้องการก่อนที่เราจะทำแพ็กเกจเพื่อใช้งาน
เครื่องมือ Winget โดย Windows จะจัดการการติดตั้งและอัปเกรดแพ็คเกจแอปพลิเคชันใน Windows 10 และ 11 ในการใช้เครื่องมือนี้ คุณต้องติดตั้ง Windows 10 ขึ้นไปบนพีซีของคุณเป็นอย่างน้อย
เปิดเทอร์มินัล PowerShell แล้วเรียกใช้คำสั่ง:
Winget install GnuWin32.make
หลังการติดตั้ง ให้กด Win + R แล้วใส่ systempropertiesadvanced -> OK
ลือกแท็บ Advanced -> Environment Variables
คลิกที่ Path
ที่ติดตั้งโปรแกรมอยู่ที่ C:\Program Files (x86)\GnuWin32\bin
คลิก New -> ใส่ C:\Program Files (x86)\GnuWin32\bin -> OK (จากนั้นรีสตาร์ทคอมพิวเตอร์)
สร้างโปรเจค Go เพื่อทดสอบ
สร้างไฟล์ main.go เขียนโค้ดดังนี้
package main
import "fmt"
func main() {
fmt.Println("Hello Makefile")
}
สร้างไฟล์ Makefile เขียนโค้ดดังนี้
hello:
echo "Hello"
build:
go build -o bin/main main.go
run:
go run main.go
ทดสอบการทำงาน
ทดสอบการทำงานด้วยคำสั่ง
make hello
ผลลัพธ์ : แสดงข้อความ “hello”
ทดสอบการทำงานด้วยคำสั่ง
make build
ผลลัพธ์ : สร้างไฟล์ main.exe ในไดเร็กทอรีใหม่ bin/ ของเราได้สำเร็จ
ทดสอบการทำงานด้วยคำสั่ง
make run
ผลลัพธ์ : ที่นี่เราเห็นว่าแอปพลิเคชั่น go ของเราทำงาน
เรื่องใหญ่คืออะไร?
ณ จุดนี้คุณอาจถามว่าการใช้ Makefiles สำหรับแอปพลิเคชัน Go ของคุณเป็นเรื่องใหญ่อย่างไร
ลองนึกภาพว่าคุณต้องการคอมไพล์แอปพลิเคชันของคุณข้ามเพื่อให้ทำงานบนทุกระบบปฏิบัติการและทุกสถาปัตยกรรมที่มี แต่ไม่ต้องการตั้งค่า GOOS และ GOARCH ตัวแปรด้วยตนเองสำหรับทุกคำสั่ง
ภายในไฟล์ Makefile ของคุณ คุณสามารถกำหนดเป้าหมาย compile ใหม่ซึ่งมีคำสั่ง build ทั้งหมดพร้อมชุดที่เหมาะสม GOOS และ GOARCH ได้เป็นต้น
compile:
echo "Compiling for every OS and Platform"
GOOS=freebsd GOARCH=386 go build -o bin/main-freebsd-386 main.go
GOOS=linux GOARCH=386 go build -o bin/main-linux-386 main.go
GOOS=windows GOARCH=386 go build -o bin/main-windows-386 main.go
คำสั่งเลเยอร์
ตอนนี้ ลองจินตนาการว่าเรากำลังทำงานกับระบบที่ซับซ้อนซึ่งมีกระบวนการสร้าง/รันแบบหลายขั้นตอนซึ่งพัฒนามาหลายปีแล้ว แทนที่จะต้องกำหนดคำสั่งทั้งหมดที่จำเป็นในการสร้างและเรียกใช้ในเป้าหมายเดียว คุณสามารถแบ่งทุกอย่างออกเป็นเป้าหมายที่เล็กกว่าและมีบางอย่างที่เหมือนกับ all เป้าหมายที่รวมไว้ใน make คำสั่งเดียว
hello:
echo "Hello"
build:
go build -o bin/main main.go
run:
go run main.go
compile:
echo "Compiling for every OS and Platform"
GOOS=linux GOARCH=arm go build -o bin/main-linux-arm main.go
GOOS=linux GOARCH=arm64 go build -o bin/main-linux-arm64 main.go
GOOS=freebsd GOARCH=386 go build -o bin/main-freebsd-386 main.go
all: hello build
credit : https://tutorialedge.net/golang/makefiles-for-go-developers/