Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
custom_lintで始めるチームルール管理
Search
Kosei Akaboshi (akaboshinit)
March 26, 2025
Programming
0
130
custom_lintで始めるチームルール管理
Kosei Akaboshi (akaboshinit)
March 26, 2025
Tweet
Share
More Decks by Kosei Akaboshi (akaboshinit)
See All by Kosei Akaboshi (akaboshinit)
WasmがFlutter on the Webに もたらす変化
akaboshinit
0
22
Other Decks in Programming
See All in Programming
AtCoder Heuristic First-step Vol.1 講義スライド
terryu16
2
1k
DomainException と Result 型で作る型安全なエラーハンドリング
karszawa
0
490
リアクティブシステムの変遷から理解するalien-signals / Learning alien-signals from the evolution of reactive systems
yamanoku
2
1.1k
Denoでフロントエンド開発 2025年春版 / Frontend Development with Deno (Spring 2025)
petamoriken
1
1.3k
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
0
1k
AI Agents with JavaScript
slobodan
0
140
Firebase Dynamic Linksの代替手段を自作する / Create your own Firebase Dynamic Links alternative
kubode
0
180
今から始めるCursor / Windsurf / Cline
kengo_hayano
0
110
Kubernetesで実現できるPlatform Engineering の現在地
nwiizo
2
1.7k
PHPer's Guide to Daemon Crafting Taming and Summoning
uzulla
2
1.1k
php-fpm がリクエスト処理する仕組みを追う / Tracing-How-php-fpm-Handles-Requests
shin1x1
5
850
Develop Faster With FrankenPHP
dunglas
2
2.7k
Featured
See All Featured
BBQ
matthewcrist
88
9.5k
Statistics for Hackers
jakevdp
798
220k
GitHub's CSS Performance
jonrohan
1030
460k
A designer walks into a library…
pauljervisheath
205
24k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
12
610
Building Your Own Lightsaber
phodgson
104
6.3k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.6k
Testing 201, or: Great Expectations
jmmastey
42
7.4k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Making the Leap to Tech Lead
cromwellryan
133
9.2k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
470
Transcript
custom_lintで始める チームルール管理 株式会社WINTICKET 赤星 @akaboshinit
• Dart/Flutterの独自のLintを利用できるパッケージ • custom_lintを基盤に利用しているLintパッケージ ◦ riverpod_lint ◦ etc… (pub.devでは70個以上のパッケージ) •
作者はRiverpodやFreezedの作者であるRemiさん(invertase.io) custom_lintとは https://x.com/remi_rousselet
custom_lintでできることを簡単に解説
Editor上でエラーを表示 custom_lintでできること
修正のアシスト ワンクリックで修正 custom_lintでできること
CLIでエラーを検知 CIをエラー落とす custom_lintでできること
“--fix”を使って 自動でコード全体を修正 custom_lintでできること
custom_lintでできること • これまでの機能を全て独自で実装可能 • Lintルールを外部に公開可能 ◦ 誰かの作ったLintを利用できる
すごく便利
custom_lint チーム/個人で使ってますか ??
今回のテーマ
CA.flutter #3 〜Flutterエンジニアが開発スピード /開発生産性を上げるには〜
WINTICKETでの custom_lint活用法
• 社内パッケージ ◦ 12個の独自ルール • 外部リントパッケージ ◦ 2個 ◦ (今後さらに拡充予定)
WINTICKETでのcustom_lint
WINTICKETでのcustom_lint • 社内パッケージ ◦ 12個の独自ルール アプリリポジトリはmelosによってマルチパッケージ構成 その中で新たなリントパッケージを作成/運用
WINTICKETでのcustom_lint • 社内パッケージ ◦ 12個の独自ルール まず、どんな理由でLintを入れている?
lint導入の経緯を分類 WINTICKETでのcustom_lint よくレビューで 指摘がある チームルール レビューでも 気づきにくいミス
PRレビュー時での出来事 WINTICKETでのcustom_lint よくレビューで 指摘がある
PRレビュー時での出来事 “HookWidget”を使ってるが、単純な”StatelessWidget”で良い WINTICKETでのcustom_lint よくレビューで 指摘がある
• “ここHookWidgetじゃなくStatelessWidgetで行けそうですね” • “imo: StatelessWidget” WINTICKETでのcustom_lint よくレビューで 指摘がある
• “ここHookWidgetじゃなくStatelessWidgetで行けそうですね” • “imo: StatelessWidget” 正しいレビューだがコアなレビューではない => 実装の本質への集中力が減る? => 誰も幸せになれないレビュー?
WINTICKETでのcustom_lint よくレビューで 指摘がある
• “ここHookWidgetじゃなくStatelessWidgetで行けそうですね” • “imo: StatelessWidget” • “flutter_hooks_lint” ◦ “hooks_unuse_widget”で解決 WINTICKETでのcustom_lint
よくレビューで 指摘がある https://pub.dev/packages/flutter_hooks_lint
=> “flutter_hooks_lint”導入 • “HookWidget”と”StatelessWidget”のレビューがゼロに • レビューが、よりコアな部分へ集中 WINTICKETでのcustom_lint よくレビューで 指摘がある
lint導入の経緯を分類 WINTICKETでのcustom_lint チームルール レビューでも 気づきにくいミス
ユーザーのエラーログを調査している時の事 WINTICKETでのcustom_lint チームルール
ユーザーのエラーログを調査している時の事 nullabelな値を安全ではない使い方をしているWidget (force_unwarp) WINTICKETでのcustom_lint チームルール
• force_unwrapして意図せずエラーが頻発してるWidgetがあった WINTICKETでのcustom_lint チームルール
• force_unwrapして意図せずエラーが頻発してるWidgetがあった => コード全体で”force_unwrap”は避けていくチームルール決定 WINTICKETでのcustom_lint チームルール
=> コード全体で”force_unwrap”は避けていくチームルール決定 • “avoid_force_unwrap”というルールを自作 WINTICKETでのcustom_lint チームルール
=> “avoid_force_unwrap”を導入 どうしても対応が必要な場合のみ、リントのIgnoreで許容 コード全体としてforce_unwrapが大幅に減少 新たなチームルールをストレスなく導入できる WINTICKETでのcustom_lint
lint導入の経緯を分類 WINTICKETでのcustom_lint レビューでも 気づきにくいミス
testファイルは”_test”の接尾辞が必要 レビュー時もファイル名までレビューが行き届かない事がある WINTICKETでのcustom_lint レビューでも 気づきにくいミス
testファイルは”_test”の接尾辞が必要 レビュー時もファイル名までレビューが行き届かない事がある => ルールを自作 • “avoid_non_suffix_test_file_name” テストファイル名の接尾辞が “_test”であることを保証する WINTICKETでのcustom_lint レビューでも
気づきにくいミス
=> “avoid_non_suffix_test_file_name”導入 テスト実装をしている段階でLintエラーが出る事で 未実行になってしまうテストが無くなった あたりまえの事だが そこに集中する必要が無くなる WINTICKETでのcustom_lint レビューでも 気づきにくいミス
今回のテーマ
CA.flutter #3 〜Flutterエンジニアが開発スピード /開発生産性を上げるには〜
正直Lintで開発スピード /開発生産性が 上がるのは言うまでも無い
そんな良い話 でもお高いんでしょう ...?
custom_lintの辛い話
Lint導入のハードル
ある外部Lintパッケージ導入時の話 Lint導入のハードル
“--fix”を使って 自動でコード全体を修正 custom_lintでできること
• Fixコマンドで簡単一括修正 Lint導入のハードル
• Fixコマンドで簡単一括修正 ◦ 簡単に導入/修正できる一方で少し気になるところも Lint導入のハードル
• Fixコマンドで簡単一括修正 ◦ 初回Fixコマンド実行時間 ▪ +約15分 • (前提初回の実行は特に重い) ◦ 平常時のCI実行時間
▪ +約3分 Lint導入のハードル
• Fixコマンドで簡単一括修正 ◦ 初回Fixコマンド実行時間 ▪ avg + 約2分 • (前提初回の実行は特に重く+15分)
◦ 平常時のCI実行時間 ▪ avg + 約3分 Lint導入のハードル コードの量や リントの種類にもよります ひとえに 全て重くなる訳ではないです
• Fixコマンドで簡単一括修正 • FixやCIの実行時間が増加 ▪ ルールによってはFix,CIの実行時間が増大する可能性がある Lint導入のハードル
• Lintを追加する事でLintに違反している部分は全てエラーになる Lint導入のハードル
• Lintを追加する事でLintに違反している部分は全てエラーになる ◦ 既存実装でLint違反している場所への対処法を考える必要があ る Lint導入のハードル
• Lintを追加する事でLintに違反している部分は全てエラーになる ◦ 既存実装でLint違反している場所への対処法を考える必要があ る ▪ 全ての箇所を修正する • ▪ 既存実装部分は全てIgnoreする
• Lint導入のハードル
• Lintを追加する事でLintに違反している部分は全てエラーになる ◦ 既存実装でLint違反している場所への対処法を考える必要があ る ▪ 全ての箇所を修正する • 基本はこっちを目指す ▪
既存実装部分は全てIgnoreする • 新たなコードでのルール違反を無くせる Lint導入のハードル
また別のLintパッケージを導入する際の話 Lint導入のハードル
• ルールの考慮から外れた、意図しないリントエラーが発生 Lint導入のハードル
• ルールの考慮から外れた、意図しないリントエラーが発生 ◦ コード上ではルールに適合しているが ルールの実装上で考慮がなされてないケースでエラー発生 ▪ 一時Ignoreで対応 Lint導入のハードル
• ルールの考慮から外れた、意図しないリントエラーが発生 ◦ ルール作成をする上で簡単に想定外は起きる ◦ 複雑性のあるルールであるほど考慮すべき事が増えていく => 独自ルールを作る時は、できるだけルールそのものをシ ンプルにする =>
それでも複雑なのであるなら、そうなっている構造そのも のを疑う Lint導入のハードル
“custom_lint”導入によって IDEがたまに重い時があるとチームから声が上がる Lint導入のハードル
“custom_lint”導入によってIDEが重い => 少し調べてみるとPCへのメモリ負荷が高い Lint導入のハードル
• Fixコマンドで簡単一括導入 • Fix / CIの実行時間が増加 ▪ コード量にも依存する上でルールによっては Fix /
CIの実行時間が増大する可能性がある Lint導入のハードル
=> 少し調べてみると結構メモリ負荷が... 正直場合によります! だが、Lintをなんでもかんでも入れる方針は難しい Lint導入のハードル
=> 少し調べてみると結構メモリ負荷が... 正直場合によります! だが、Lintをなんでもかんでも入れる方針は難しい => ご利用は計画的に Lint導入のハードル
開発スピード /開発生産性において メリットも大きいが 運用で辛い箇所も少なくはない
ここまでcustom_lintのメリデメに ついて話してきました
もう一つ皆さんが知っておかなきゃ いけないことがあります
custom_lint 実はDart公式にリプレイスされるかも
• ある日のcustom_lintのissue custom_lintがDart公式にリプレイス ?
https://github.com/invertase/dart_custom_lint/issues/298#issuecomment-2572371705
• ある日のcustom_lintのissue • DartのPub workspace機能がリリースされてcustom_lintが、うまく 動作しないという旨のissue ◦ 最終的には有志がPRを出してPub workspace対応は完了 custom_lintがDart公式にリプレイス
?
• ある日のcustom_lintのissue • DartのPub workspace機能がリリースされてcustom_lintが、うまく 動作しないという旨 ◦ 最終的には有志がPRを出してworkspace対応は完了 => スレッドの中に気になるコメントが....
custom_lintがDart公式にリプレイス ?
https://github.com/invertase/dart_custom_lint/issues/298#issuecomment-2572371705
???
custom_lintを更新するつもりは ありません ?
スレッドを追ってみると発見したもの
• “lints”/“flutter_lints”などのデフォルトのLintを動作させている ”analyzer”パッケージのシステムを変更する予定のIssue custom_lintがDart公式にリプレイス ?
https://github.com/dart-lang/sdk/issues/53402
• “lints”/“flutter_lints”などのデフォルトのLintを動作させている ”analyzer”パッケージのシステムを変更する予定のIssue • 2023年からの古めのissue => あんまりDart側の対応優先順位は高くない? custom_lintがDart公式にリプレイス ?
https://github.com/dart-lang/sdk/issues/53402
• remiさんがこのissueの状況によって”custom_lintのサポートを停 止するかも”と言っている • 2024/11月時点に”近いうちに良い報告をするよ!”と言ってる => このスレッドから“custom_lint”の新たな開発は止まっている custom_lintがDart公式にリプレイス ?
現在“custom_lint”はメンテナンス状態に近い (有志でDartバージョンなどの追従は行われている) 今後はcustom_lintはどうするの?? custom_lintがDart公式にリプレイス ?
新たな”analyzer”によってリプレイスされそう custom_lintは、そもそも有志のパッケージ Dart側が公式のLintの仕組みを提供してくれる remoさんも、それを望んでいるように感じられる custom_lintがDart公式にリプレイス ?
実装が行われている、新たな”analyzer” 今の所かなり良い物になる予感 • プラグインシステム (custom_lintのように独自でLintを作れる) • Quick Fixなどの機能 (custom_lintでできた事ほぼできそう) •
その他いっぱい custom_lintがDart公式にリプレイス ?
• 公式が提供するだけあって、Dart言語自体がLintに優しい機能を追 加することもあるかもしれない • ”custom_lint”同様の機能はサポートされそう • 将来的に”custom_lint”ではなく公式の”analyzer”でLintを作る未 来があるかもしれない custom_lintがDart公式にリプレイス ?
Lintが重いなどの問題は 十分に解決されそう
とはいえいつ来るかは分からない それまで“custom_lint”を 使うメリットは ? => 十分ある
custom_lintに全部賭ける custom_lintにちょっと賭ける
custom_lintがなく無くなっても 代替可能にしやすくしておく
最後に • Lint(custom_lint)は集中すべき事に集中させてくれる ◦ 開発スピード/生産性を上げる • “custom_lint”は辛い部分もある ◦ 負荷が高くなりがち •
新しい“analyzer”がもっとLintを良くしてくれるかも ◦ Lint込みの開発フローを始めて損は無い ◦ “custom_lint”に全力を注ぎすぎなくても良いかも
外部のLintパッケージは数多くある(70個以上) でも使いやすいルールは、いろんなパッケージに散らばっている これ入れとけばとりあえず良い感じなLintパッケージが欲しい❗ 最後に宣伝
最後に宣伝 https://pub.dev/packages/nilts
外部のLintパッケージは数多くある(70個以上) でも使いやすいルールは、いろんなパッケージに散らばっている これ入れとけばとりあえず良い感じなLintパッケージが欲しい❗ 紹介した新たな“analyzer”がLintのデファクトになったとしても必ず対応し ます❗❗❗ 最後に宣伝
終