ได้พัฒนาฟอร์แมตเตอร์สำหรับ C, C++ และ Java โดยใช้ Clang ในสภาพแวดล้อม Node.js
(github.com/lumirlumir)สวัสดีครับ ผมได้พัฒนาฟอร์แมตเตอร์สำหรับ C, C++ และ Java โดยใช้ Clang ในสภาพแวดล้อม Node.js โปรเจกต์นี้เป็นโปรเจกต์ใหม่ที่ต่อยอดจากแพ็กเกจ clang-format ของ angular ซึ่งปัจจุบันเลิกบำรุงรักษาแล้ว (deprecated)
เมื่อประมาณหนึ่งถึงสองเดือนก่อน ผมเคยโพสต์เรื่องนี้ไว้ครั้งหนึ่งแล้ว แต่ตอนนี้แพ็กเกจมีความเสถียรมากขึ้นและมีการเพิ่มฟีเจอร์ใหม่ ๆ เข้ามา จึงกลับมาเขียนโพสต์อีกครั้ง
ขณะนี้มีหลายท่านให้ความสนใจ และด้วยการที่ผู้ใช้ legacy เดิมจำนวนมากย้ายมาใช้งาน ทำให้ยอดดาวน์โหลดรายสัปดาห์ทะลุ 10,000 ครั้งแล้ว ขอบคุณมากจริง ๆ ครับ
นอกจากนี้ แพ็กเกจนี้ทำ full test coverage ได้แล้ว และมี PR ที่เสนอให้ Node.js core เปลี่ยนจากการใช้โปรเจกต์ clang-format เดิมของ angular มาใช้แพ็กเกจนี้แทน ดังนั้นในแง่ความเสถียรน่าจะมั่นใจและใช้งานกันได้ครับ (แน่นอนว่าอาจยังมีบางจุดที่ผมมองข้ามไปอยู่บ้าง...)
แพ็กเกจนี้เป็นแพ็กเกจที่ช่วยจัดรูปแบบโค้ดสำหรับภาษา C, C++ และ Java โดยอ้างอิงจาก clang-format ของ Clang ซึ่งเป็นที่รู้จักกันดีในฐานะคอมไพเลอร์ C ของ LLVM ถ้ามองแบบง่าย ๆ ก็ถือว่าทำหน้าที่เดียวกับ Prettier ซึ่งเป็นหนึ่งในแพ็กเกจที่มีชื่อเสียงที่สุดในสภาพแวดล้อม Node.js
อย่างไรก็ตาม แพ็กเกจ Prettier ไม่รองรับการจัดรูปแบบสำหรับภาษา C, C++ และ Java ดังนั้นเมื่อต้องการจัดรูปแบบโค้ดในภาษาเหล่านี้ จึงมักใช้ clang-format กัน
clang-format ในสภาพแวดล้อม Node.js มีประโยชน์อย่างมากโดยเฉพาะในกรณีที่ต้องเขียนทั้งโค้ด JavaScript และโค้ด C/C++ ไปพร้อมกัน เช่น การพัฒนา Node.js core สำหรับ clang-format แบบเดิมนั้น จำเป็นต้องติดตั้ง dependency เพิ่มเติมเพื่อใช้งานแพ็กเกจ แต่ถ้าใช้แพ็กเกจนี้ก็ไม่จำเป็นอีกต่อไป
นอกจากนี้ แพ็กเกจ clang-format เดิมยังมีความยุ่งยากพอสมควรในการผนวกเข้ากับ workflow ที่ใช้ Node.js และ npm เช่นใน CI แต่หากใช้แพ็กเกจนี้ เพียงดาวน์โหลดจาก npm และตั้งค่าสคริปต์เท่านั้น จึงมีข้อดีมากมายในสภาพแวดล้อม CI
เพิ่มเติมคือ เมื่ออัปเกรดเป็นเวอร์ชัน 1.2.0 ก็ได้มีการเพิ่มฟีเจอร์ใหม่เข้ามา โดยการเปลี่ยนแปลงสำคัญคือการเพิ่มแพ็กเกจ git-clang-format
ลองยกตัวอย่างสถานการณ์ที่กำลังพัฒนาโปรเจกต์ C/C++ และเริ่มรู้สึกถึงความจำเป็นของการจัดรูปแบบโค้ด จนอยากนำแพ็กเกจอย่าง clang-format มาใช้
ในโปรเจกต์ขนาดเล็ก อาจไม่มีปัญหาอะไรมากนักหากจะแก้ไขการจัดรูปแบบโค้ดทั้งหมดในคราวเดียวแล้ว commit ทีเดียว เพราะยังติดตามประวัติได้ไม่ยาก แต่ในโปรเจกต์ขนาดใหญ่ การนำการจัดรูปแบบโค้ดเข้ามาใช้อาจทำให้ต้องแก้ไข formatting ของโค้ดเดิมทั้งหมดพร้อมกัน ซึ่งเสี่ยงทำให้การติดตาม commit history ดูยุ่งเหยิง
ในกรณีนี้ ถ้านักพัฒนาแก้ไขโค้ดเพียง 100 บรรทัดจากทั้งหมด 1000 บรรทัด และตอน commit ตรวจสอบ formatting เฉพาะ 100 บรรทัดที่ถูกแก้ไข จะเกิดอะไรขึ้น? อย่างแรกคือ เมื่อใช้ formatting เฉพาะกับ 100 บรรทัดที่แก้ไข ก็ไม่จำเป็นต้องรื้อแก้ทั้ง 1000 บรรทัด ทำให้ติดตาม commit history ได้สะดวกขึ้น อย่างที่สองคือ ระหว่างการพัฒนา เมื่อมีการ commit โค้ดอย่างต่อเนื่อง โค้ดที่ผ่านการจัดรูปแบบก็จะค่อย ๆ เพิ่มขึ้น ทำให้ formatting ของโค้ดทั้งโปรเจกต์มีความสม่ำเสมอมากขึ้นตามเวลา
สิ่งที่ใช้เพื่อจุดประสงค์นี้คือแพ็กเกจ git-clang-format เช่นเดียวกับที่ lint-staged ช่วยตรวจเฉพาะไฟล์ที่ถูก staged เพื่อเพิ่มความเร็วใน CI เครื่องมือนี้ไปได้ไกลกว่าอีกขั้น โดยสามารถตรวจเฉพาะบรรทัดของโค้ดที่มีการเปลี่ยนแปลงภายในไฟล์ที่ถูกแก้ไข และนำการตรวจ formatting ไปใช้กับเฉพาะส่วนนั้นได้ ฟีเจอร์นี้มีมาให้โดยพื้นฐานจาก LLVM อยู่แล้ว จึงได้นำมาห่อเป็นแพ็กเกจและเผยแพร่ออกมา
ผมได้อธิบายวิธีใช้งานไว้อย่างละเอียดในเอกสารทางการแล้ว จึงขอฝากให้ช่วยติดตามกันด้วยครับ (แต่เอกสารทางการเป็นภาษาอังกฤษนะครับ) หากมีข้อสงสัยหรือมีความคิดเห็นอื่น ๆ ก็ฝากคอมเมนต์ไว้ได้เลย ขอบคุณที่อ่านมาจนจบครับ
เอกสารทางการ: https://clang-format-node.lumir.page
เรโพซิทอรี: https://github.com/lumirlumir/npm-clang-format-node
2 ความคิดเห็น
ขอเป็นกำลังใจให้การพัฒนาโอเพนซอร์สครับ!
ขอบคุณครับ!!🙇♂️