ฉันชอบ Makefile
(switowski.com)-
ฉันชอบ Makefile ใช้มันครั้งแรกมากว่า 10 ปีแล้ว ตอนนั้นมันก็ดูเหมือนเทคโนโลยีเก่าอยู่แล้ว เมื่อเวลาผ่านไปมี build tool ใหม่ ๆ เกิดขึ้นและหายไป แต่ Makefile ก็ยังคงถูกใช้งานอยู่ พอได้ร่วมงานในหลายโปรเจ็กต์ก็เริ่มคุ้นเคยกับมัน และเมื่อถึงจุดหนึ่งก็กลายเป็นว่าชอบมันไปแล้ว ตอนนี้มันคือเครื่องมืออัตโนมัติตัวแรกที่ฉันใช้เวลาเริ่มโปรเจ็กต์ใหม่
-
เหตุผลที่ฉันชอบ Makefile คือมันทำตามธรรมเนียมแบบไม่เป็นทางการในการกำหนดชุดคำสั่งแบบเดียวกัน เมื่อเจอโปรเจ็กต์ใหม่ ถ้ามีไฟล์
Makefileอยู่ ฉันก็จะลองรันmakeหรือmake buildแล้วตามด้วยmake installซึ่งจะช่วย build และตั้งค่าโปรเจ็กต์ให้เสร็จ หรืออย่างน้อยก็ทำให้รู้ว่าต้องมีขั้นตอนเพิ่มเติมอะไรบ้าง -
ฉันพยายามใช้ธรรมเนียมเดียวกันนี้กับโปรเจ็กต์ของตัวเองด้วย ถ้าเปิดโฟลเดอร์โปรเจ็กต์เก่าแล้วรัน
make devมันจะทำทุกขั้นตอนที่จำเป็นเพื่อ build โปรเจ็กต์และรัน development server ฉันใช้เทคโนโลยีหลากหลาย แต่ละอย่างจึงมีคำสั่งต่างกันไป พอใช้ Makefile ก็ทำให้ดูแลโปรเจ็กต์ที่ไม่ได้แตะมาหลายเดือนหรือหลายปีได้ง่ายขึ้น -
Makefile นั้นเรียบง่าย ฉันไม่ใช้เงื่อนไข, flags หรือฟีเจอร์ซับซ้อนอื่น ๆ งานส่วนใหญ่ประกอบด้วย shell command หนึ่งคำสั่งหรือมากกว่า จะเขียนเป็น bash script ที่มีฟังก์ชันเล็กน้อยก็ได้ แต่ Makefile เขียนได้ง่ายและเร็วกว่า
-
โปรเจ็กต์ส่วนตัวส่วนใหญ่มักมีงานทั่วไปประมาณนี้:
dev: เริ่ม development serverbuild: build โปรเจ็กต์ (ถ้าจำเป็นต้องมีขั้นตอน build)deploy: deploy/เผยแพร่โปรเจ็กต์
-
บล็อกนี้มี Makefile แบบง่ายที่มี target เดียว:
dev: npm run dev -
ในโปรเจ็กต์ที่ซับซ้อนกว่านี้ ฉันใช้ Makefile ประมาณนี้:
# รัน development server dev: bundle exec jekyll serve --unpublished -w --config _config.yml,_config-dev.yml --livereload # build assets build: npm run gulp build # เฝ้าดูโฟลเดอร์ที่กำหนดและประมวลผล assets watch: npm run gulp watch -- --wip # build เว็บไซต์ในเครื่อง, เข้ารหัส และ deploy ไปยังเซิร์ฟเวอร์ Netlify deploy: JEKYLL_ENV=production bundle exec jekyll build; \ make encrypt; \ netlify deploy --prod # เข้ารหัสโฟลเดอร์ "_site" encrypt: npx staticrypt _site/*.html -r -d _site -
ในตัวอย่างข้างบนนี้กำลังละเลยเรื่องการมีอยู่ของ phony target ถ้ามีไฟล์ชื่อ
dev,build,watch,deployหรือencryptอยู่ Makefile อาจทำงานไม่เป็นไปตามที่คาดไว้ -
GNU Make ใช้กันอย่างแพร่หลายมาก บน Linux ก็มักจะติดตั้งมาอยู่แล้ว บน MacBook ฉันก็จำไม่ได้ว่าเคยติดตั้งมันเอง น่าจะถูกติดตั้งมาพร้อมเครื่องมืออื่น ๆ Make นั้นเรียบง่ายและมี dependency เพิ่มเติมน้อยกว่า build tool อื่น ๆ จึงมีประโยชน์ในสภาพแวดล้อมที่จำกัด มีความเป็นไปได้สูงว่าเครื่องจะมี Make อยู่แล้ว ถ้าไม่มีก็ยังสามารถรันคำสั่งใน Makefile ด้วยตัวเองผ่าน shell ได้
-
ไม่ได้หมายความว่าฉันต่อต้าน build tool อื่น ๆ เวลาเจอ build tool ใหม่ก็ยังรู้สึกน่าสนใจอยู่ แต่ฉันก็ยังใช้ Make เพื่อจัดการเครื่องมือหลากหลายแบบอยู่ดี
สรุปโดย GN⁺
- Makefile ช่วยให้จัดการโปรเจ็กต์ได้ง่ายขึ้นด้วยการมีชุดคำสั่งที่สม่ำเสมอในหลายโปรเจ็กต์
- ด้วยไวยากรณ์ที่เรียบง่ายและ dependency ที่น้อย จึงใช้งานได้ดีแม้ในสภาพแวดล้อมที่จำกัด
- สามารถใช้ร่วมกับ build tool ได้หลากหลาย จึงมีความยืดหยุ่นสูง
- เครื่องมือที่มีความสามารถคล้ายกันได้แก่
CMake,Ninja,Gradleเป็นต้น
2 ความคิดเห็น
หากเป็น makefile ที่ไม่ได้กำหนดการพึ่งพาไว้ การแทนที่ด้วย justfile จะให้ประสบการณ์การใช้งานที่ดีกว่า
ความคิดเห็นบน Hacker News
การสนับสนุนให้ใช้ Make
ปัญหาของ Makefiles
ข้อดีของ Make
การใช้ target แบบ PHONY
การถกเถียงอย่างดุเดือดเกี่ยวกับ Make
การนำ Make ไปใช้ได้หลากหลาย
ข้อจำกัดของ Make และทางเลือกอื่น
การย้ายไปใช้ Justfiles
การใช้ Makefile แบบเรียบง่าย