Khi chúng ta nói vể lint, nhiều developer nghĩ nó liên quan đến code style guide. Chà!, nhưng thực chất không chỉ có thế
Linting is the process of analyzing code for potential errors.
Là một Android developer, chúng ta sử dụng ngôn ngữ kotlin để phát triển ứng dụng của mình, nhưng làm sao để đoạn code của chúng ta clean và dễ đang để đọc? Có thể vẫn có nhiều người trong chúng ta vẫn bị ảnh hưởng bởi Java Code Style hay một số học theo Kotlin Style Guide
Ktlin có thể là trợ lý của chúng ta, nó được tạo ra để trở thành một định dạng viết tiêu chuẩn của Kotlin với sự đơn giản, mở rộng và có một công đồng hoạt động tích cực. Vậy làm thể nào để chúng ta sử dụng Ktlin trong project của mình?
Chúng ta nên đọc tài liệu trên Ktlint, có rất nhiều cách để cài đặt Ktlint, ở bài viết này mình chỉ giới thiệu 1 cách
Cài đặt
Add Plugin cho build.grade.kts của bạn
1 2 3 4 | plugins <span class="token punctuation">{</span> <span class="token function">id</span><span class="token punctuation">(</span><span class="token string">"org.jlleitschuh.gradle.ktlint"</span><span class="token punctuation">)</span> version Versions<span class="token punctuation">.</span>ktlintPlugin <span class="token punctuation">}</span> |
Sau đó setup các thuộc tính trong Ktlin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ktlint <span class="token punctuation">{</span> version<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>Versions<span class="token punctuation">.</span>ktlint<span class="token punctuation">)</span> debug<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span> verbose<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span> android<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span> outputToConsole<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span> reporters<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token function">setOf</span><span class="token punctuation">(</span>ReporterType<span class="token punctuation">.</span>PLAIN<span class="token punctuation">,</span>ReporterType<span class="token punctuation">.</span>CHECKSTYLE<span class="token punctuation">)</span><span class="token punctuation">)</span> ignoreFailures<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span> kotlinScriptAdditionalPaths <span class="token punctuation">{</span> <span class="token function">include</span><span class="token punctuation">(</span><span class="token function">fileTree</span><span class="token punctuation">(</span><span class="token string">"scripts/"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> filter <span class="token punctuation">{</span> <span class="token function">exclude</span><span class="token punctuation">(</span><span class="token string">"**/generated/**"</span><span class="token punctuation">)</span> <span class="token function">include</span><span class="token punctuation">(</span><span class="token string">"**/kotlin/**"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Thêm ktlin cho các subproject
1 2 3 4 5 6 7 8 9 | subprojects <span class="token punctuation">{</span> <span class="token function">apply</span><span class="token punctuation">(</span>plugin <span class="token operator">=</span> <span class="token string">"org.jlleitschuh.gradle.ktlint"</span><span class="token punctuation">)</span> <span class="token comment">// Optionally configure plugin</span> ktlint <span class="token punctuation">{</span> debug <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Ví dụ chi tiết bạn có thể tham khảo ví dụ sau đây
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | ext<span class="token punctuation">.</span>ReporterType <span class="token operator">=</span> org<span class="token punctuation">.</span>jlleitschuh<span class="token punctuation">.</span>gradle<span class="token punctuation">.</span>ktlint<span class="token punctuation">.</span>reporter<span class="token punctuation">.</span>ReporterType apply plugin<span class="token operator">:</span> <span class="token string">"org.jlleitschuh.gradle.ktlint"</span> ktlint <span class="token punctuation">{</span> version <span class="token operator">=</span> <span class="token string">"0.34.2"</span> debug <span class="token operator">=</span> <span class="token boolean">true</span> verbose <span class="token operator">=</span> <span class="token boolean">true</span> android <span class="token operator">=</span> <span class="token boolean">false</span> outputToConsole <span class="token operator">=</span> <span class="token boolean">true</span> reporters <span class="token operator">=</span> <span class="token punctuation">[</span>ReporterType<span class="token punctuation">.</span>PLAIN<span class="token punctuation">,</span> ReporterType<span class="token punctuation">.</span>CHECKSTYLE<span class="token punctuation">]</span> ignoreFailures <span class="token operator">=</span> <span class="token boolean">true</span> enableExperimentalRules <span class="token operator">=</span> <span class="token boolean">true</span> additionalEditorconfigFile <span class="token operator">=</span> <span class="token function">file</span><span class="token punctuation">(</span><span class="token string">"/some/additional/.editorconfig"</span><span class="token punctuation">)</span> kotlinScriptAdditionalPaths <span class="token punctuation">{</span> include <span class="token function">fileTree</span><span class="token punctuation">(</span><span class="token string">"scripts/"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> filter <span class="token punctuation">{</span> <span class="token function">exclude</span><span class="token punctuation">(</span><span class="token string">"**/generated/**"</span><span class="token punctuation">)</span> <span class="token function">include</span><span class="token punctuation">(</span><span class="token string">"**/kotlin/**"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> buildscript <span class="token punctuation">{</span> repositories <span class="token punctuation">{</span> maven <span class="token punctuation">{</span> url <span class="token string">"https://plugins.gradle.org/m2/"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> dependencies <span class="token punctuation">{</span> classpath <span class="token string">"org.jlleitschuh.gradle:ktlint-gradle:8.2.0"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> allprojects <span class="token punctuation">{</span> <span class="token comment">/* no need configuration */</span> <span class="token punctuation">}</span> subprojects <span class="token punctuation">{</span> apply plugin<span class="token operator">:</span> <span class="token string">"org.jlleitschuh.gradle.ktlint"</span> <span class="token punctuation">}</span> task <span class="token function">clean</span><span class="token punctuation">(</span>type<span class="token operator">:</span> Delete<span class="token punctuation">)</span> <span class="token punctuation">{</span> delete rootProject<span class="token punctuation">.</span>buildDir <span class="token punctuation">}</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <span class="token keyword">import</span> org<span class="token punctuation">.</span>jlleitschuh<span class="token punctuation">.</span>gradle<span class="token punctuation">.</span>ktlint<span class="token punctuation">.</span>reporter<span class="token punctuation">.</span>ReporterType plugins <span class="token punctuation">{</span> <span class="token function">id</span><span class="token punctuation">(</span><span class="token string">"org.jlleitschuh.gradle.ktlint"</span><span class="token punctuation">)</span> version Versions<span class="token punctuation">.</span>ktlintPlugin <span class="token comment">// "8.2.0"</span> <span class="token punctuation">}</span> ktlint <span class="token punctuation">{</span> version<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>Versions<span class="token punctuation">.</span>ktlint<span class="token punctuation">)</span> <span class="token comment">// "0.34.2"</span> debug<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span> verbose<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span> android<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span> outputToConsole<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span> reporters<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token function">setOf</span><span class="token punctuation">(</span>ReporterType<span class="token punctuation">.</span>PLAIN<span class="token punctuation">,</span> ReporterType<span class="token punctuation">.</span>CHECKSTYLE<span class="token punctuation">)</span><span class="token punctuation">)</span> ignoreFailures<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span> kotlinScriptAdditionalPaths <span class="token punctuation">{</span> <span class="token function">include</span><span class="token punctuation">(</span><span class="token function">fileTree</span><span class="token punctuation">(</span><span class="token string">"scripts/"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> filter <span class="token punctuation">{</span> <span class="token function">exclude</span><span class="token punctuation">(</span><span class="token string">"**/generated/**"</span><span class="token punctuation">)</span> <span class="token function">include</span><span class="token punctuation">(</span><span class="token string">"**/kotlin/**"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> buildscript <span class="token punctuation">{</span> <span class="token comment">/* no need configuration */</span> <span class="token punctuation">}</span> allprojects <span class="token punctuation">{</span> <span class="token comment">/* no need configuration */</span> <span class="token punctuation">}</span> subprojects <span class="token punctuation">{</span> <span class="token function">apply</span><span class="token punctuation">(</span>plugin <span class="token operator">=</span> <span class="token string">"org.jlleitschuh.gradle.ktlint"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> tasks<span class="token punctuation">.</span><span class="token function">register</span><span class="token punctuation">(</span><span class="token string">"clean"</span><span class="token punctuation">,</span> Delete<span class="token operator">::</span><span class="token keyword">class</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">delete</span><span class="token punctuation">(</span>rootProject<span class="token punctuation">.</span>buildDir<span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Kiểm tra lại
Sau khi confige xong bạn có thể mở terminal và chay lệnh ./gradlew ktlintCheck để thấy các cảnh báo lỗi được tìm thấy
Khi chạy ./gradlew ktlintCheck nó sẽ hiển thị một số lỗi định dạng. Không chỉ có thế, nó sẽ hiển thị cho bạn chính xác lỗi gặp phải, bạn có thể tự động sửa lỗi bằng cách chạy lệnh: ./gradlew ktlintFormat
Tham khảo
https://proandroiddev.com/simplify-android-kotlin-code-with-ktlint-20c702108901