มาทำความรู้จักกับ Ktlint กัน

iMint
KBTG Life
Published in
4 min readJun 11, 2024
https://pinterest.github.io/ktlint/latest/

การเขียนโค้ดก็เหมือนการเขียนหนังสือหนึ่งเล่ม ที่จะต้องประกอบไปด้วยโครงเรื่อง เนื้อเรื่อง การเรียบเรียงถ้อยคำ การจัดรูปแบบ เพื่อให้ผู้ที่เข้ามาอ่านหนังสือเล่มนั้นอ่านง่ายและเข้าใจง่าย

นอกจากโครงสร้างการเขียน เช่น MVC, MVP, MVVM หรือ MVI อีกสิ่งที่สำคัญไม่น้อยไปกว่ากันในการเขียนโค้ดคือการเรียบเรียงและการจัดรูปแบบ เพื่อให้ง่ายต่อการเข้าใจของผู้ที่มาอ่านหรือเขียนโค้ดต่อจากเรา และให้การเขียนโค้ดเป็นไปในทิศทางเดียวกัน

Generated by AI

และสิ่งที่เข้ามาตอบโจทย์ในส่วนนี้คือ Lint เครื่องมือที่ทำหน้าที่ตรวจสอบและบังคับใช้รูปแบบโค้ด ซึ่งในปัจจุบันสำหรับ Android เราก็มี Ktlint ในรูปแบบเครื่องมือที่ใช้คำสั่งผ่าน Command Line ช่วยตรวจสอบ Format โค้ดของภาษา Kotlin

Generated by AI

นำ Ktlint มาใช้ในโปรเจค

การนำ Ktlint มาใช้ในโปรเจคนั้นมีอยู่ด้วยกัน 2 วิธี วิธีแรกคือการใช้ Extension จะทำให้ Ktlint อยู่บนเครื่องของผู้ใช้งาน ส่วนวิธีที่สองคือการฝัง Ktlint ลงในโปรเจคของเราเลย

1. การใช้ Extension

การใช้ Extension ผ่านการลง Brew เป็นข้อมูลจากเอกสาร Office ของ Ktlint ซึ่งสามารถลงผ่าน Brew และใช้งาน Ktlint ผ่าน Terminal หรือ Command Line ได้เลย

brew install ktlint
ktlint --format
# or
ktlint -F

การใช้ Extension ผ่าน Android Studio เป็นอีกวิธีที่สะดวกมากๆ เข้าไปที่ Setting ที่เมนู Plugins จากนั้นค้นหาคำว่า Ktint แล้วทำการติดตั้งได้เลย

วิธีใช้งานก็ไม่ได้ยากอย่างที่คิด เพียงเข้าไปที่ Refactor แล้วมองหาเมนู Ktlint Format

https://plugins.jetbrains.com/plugin/15057-ktlint

ทั้งนี้การใช้วิธีดังกล่าวจะไม่ได้ทำให้ Ktlint ติดไปกับโปรเจคของเรา แต่จะอยู่แค่ในเครื่องผู้ใช้งานเท่านั้น

2.การฝัง Ktlint ในโปรเจค

วิธีนี้จะเป็นที่นิยมของเหล่า Developer ส่วนใหญ่ เพราะเมื่อเรา Clone โปรเจคไปลงที่เครื่องอื่นๆ เราจะสามารถใช้ Ktlint ได้อย่างสะดวกและเป็นไปในทิศทางเดียวกันกับที่ทีมพัฒนากำหนด

ที่มาของ Library ตัวนี้มาจากการพัฒนาของ GitHub: JLLeitschuh/ktlint-gradle ต่อยอดมาจาก Ktlint Office ที่ผูกติดกับ Gradle

วิธีใช้ Ktlint Gradle

เพิ่ม Library ลงใน app/build.gradle โดยสามารถเข้าไปเช็ค Current Version ได้ที่ GitHub: JLLeitschuh/ktlint-gradle

plugins {
id("org.jlleitschuh.gradle.ktlint") version "<current_version>"
}

repositories {
// Required to download KtLint
mavenCentral()
}

เพิ่มขอบเขตการใช้งาน Ktlint ลงใน app/build.gradle โดยสามารถเข้าไปเช็ค Current Version ได้ที่ Features — Ktlint (pinterest.github.io)

ktlint {
version = "<current_version>"
android = true
ignoreFailures = false
enableExperimentalRules = true
reporters {
reporter(ReporterType.PLAIN)
reporter(ReporterType.CHECKSTYLE)
reporter(ReporterType.SARIF)
}
}

เมื่อทำการเพิ่ม Library แล้ว เราจะสามารถรันคำสั่งในการตรวจสอบโค้ดและทำการ Format โค้ดด้วยคำสั่งนี้

./gradlew ktlintCheck 
./gradlew ktlintFormat

หลังจากที่ทำการรันคำสั่งเรียบร้อย จะสามารถดูได้ว่ามีการรันที่ Success หรือ Fail หาก Fail จะมีการบอกว่า Fail ที่อะไรบ้าง ดังรูป

มีไฟล์ Report การตรวจสอบโค้ดอยู่ที่ไฟล์ Build ซึ่งเราสามารถเข้าไปตรวจสอบข้อผิดพลาดของ Style Code ที่เกิดขึ้นได้ ดังรูป

ในไฟล์ ktlintMainSourceSetCheck.xml จะเป็นรายงานที่เราสามารถนำ Source ไปใช้ในการ Disable Rule หรือ Suppress Rule ที่เราไม่ต้องการได้ด้วย

การกำหนดกฎรูปแบบโค้ด .editorconfig

เราสามารถกำหนดรูปแบบโค้ดที่ต้องการด้วยไฟล์ .editorconfig โดย Ktlint จะทำการตรวจสอบการ Format ที่ไม่ถูกต้อง ช่วยให้โค้ดของเราสอดคล้องกับกฎและดูสะอาดขึ้น

Disable Rule

เป็นการปิดการบังคับไม่ให้ตรวจสอบกฎของ Format โค้ดนี้ เช่น หากเราต้องการบังคับไม่ให้ตรวจสอบกฎการ Import Wildcard เราสามารถเพิ่มกฎดังกล่าวในไฟล์ .editorconfig ดังรูป

เราสามารถดูกฎที่จะนำมาเขียน Disable Rule ได้จากไฟล์รายงานที่กล่าวข้างต้น ด้วยการนำ Source จากรายงานมา Disable Rule ตามวิธีการเขียนนี้

ktlint_standard_<name standard of source> = disabled

ยกตัวอย่างจากไฟล์รายงานนี้ เราต้องการ Disable Rule ของ Comment-spacing ก็สามารถเพิ่มการ Disable Rule ในไฟล์ .editorconfig ได้ตามนี้

ktlint_standard_comment-spacing = disabled

Suppress Rule

เป็นการมองข้ามกฎบังคับ ไม่ให้ตรวจสอบบรรทัดหรือไฟล์นั้นๆ โดยเราสามารถเพิ่ม Annotation บน Function ที่ต้องการให้มองข้าม ซึ่งการเขียนชื่อสำหรับการ Suppress Rule จะเป็นการนำชื่อของ Source จากไฟล์รายงานมาใช้ ดังรูป

@Suppress("ktlint:standard:<name standard of source>")

การทำ Script เพื่อให้รัน Ktlint ได้ง่ายๆ

ก่อนหน้านี้ผู้เขียนเคยเขียนบทความการทำ Script ไว้รัน Emulator สามารถอ่านบทความดังกล่าวที่ลิงก์ด้านล่าง

ในส่วนนี้จะใช้หลักการเดียวกัน เริ่มจากเปิด Terminal ขึ้นมา จากนั้นพิมพ์คำสั่งสำหรับเขียนไฟล์ Script

vi {NAME}.sh

กด i (INSERT) เพื่อทำการพิมพ์คำสั่ง

พิมพ์คำสั่งของ Ktlint ลงไป จากนั้นกด esc และ :wq เพื่อเขียนและออกจากไฟล์

./gradlew ktlintCheck 
./gradlew ktlintFormat

ใน Android Studio เราสามารถกด Play (สีเขียว) เพื่อรันคำสั่ง Ktlint ได้เลย

จะเห็นว่าเราสามารถรัน Ktlint ได้อย่างง่าย เพียงแค่รัน Script ที่เราได้ทำไว้ ทำให้โค้ดของเราดูสะอาด อ่านง่าย เป็นไปในทิศทางรูปแบบเดียวกัน ทั้งยังง่ายต่อการบริหารจัดการโค้ดของเราต่อไปในอนาคต

สรุป

Android Developer โดยส่วนใหญ่แล้วจะนิยมใช้ Ktlint ที่ฝังไว้กับโปรเจคของ GitHub: JLLeitschuh/ktlint-gradle เพราะง่ายต่อการนำโค้ดที่อยู่บน Git ไปรันบน Local เครื่องนั้นๆ แถมตัว Ktlint ก็ยังสามารถรันได้โดยยึดหลักการเดียวกันที่ได้ทำไว้แล้วใน Gradle และ .editorconfig ยิ่งเราทำ Script ไว้ในไฟล์โปรเจค ก็จะยิ่งทำให้การรัน Ktlint สะดวกมากขึ้น

นอกจากนี้เรายังสามารถนำ Script ที่ทำไว้ไปใช้ใน Pipeline ของ CI/CD ได้อีกด้วย ทุกครั้งที่มีการรัน Pipeline ใน CI/CD ก็จะช่วยให้มีการตรวจเช็ครูปแบบโค้ดของเราผ่าน Ktlint ก่อนจะ Build โปรเจคนั่นเอง

ก่อนจากกันไป ขอทิ้งท้ายด้วย Trick ดีๆ อีกซักเล็กน้อย…

เราสามารถใช้ Ktlint กำหนดค่าโปรเจคให้จัดรูปแบบโค้ด Kotlin โดยอัตโนมัติก่อนที่จะสร้างโปรเจคได้ เพียงแค่เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ build.gradle

tasks.getByPath("preBuild").dependsOn("ktlintCheck").dependsOn("ktlintFormat")

See you next time 👋

สำหรับใครที่ชื่นชอบบทความนี้ อย่าลืมกดติดตาม Medium: KBTG Life เรามีสาระความรู้และเรื่องราวดีๆ จากชาว KBTG พร้อมเสิร์ฟให้ที่นี่ที่แรก

--

--