การใช้ 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/

Leave a Reply

Your email address will not be published. Required fields are marked *