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
330
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
26
Other Decks in Programming
See All in Programming
Compose Multiplatform × AI で作る、次世代アプリ開発支援ツールの設計と実装
thagikura
0
160
より安全で効率的な Go コードへ: Protocol Buffers Opaque API の導入
shwatanap
1
180
AIを活用し、今後に備えるための技術知識 / Basic Knowledge to Utilize AI
kishida
22
5.8k
1から理解するWeb Push
dora1998
7
1.9k
rage against annotate_predecessor
junk0612
0
170
ファインディ株式会社におけるMCP活用とサービス開発
starfish719
0
1.8k
ProxyによるWindow間RPC機構の構築
syumai
3
1.2k
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
520
Swift Updates - Learn Languages 2025
koher
2
490
Navigation 2 を 3 に移行する(予定)ためにやったこと
yokomii
0
320
HTMLの品質ってなんだっけ? “HTMLクライテリア”の設計と実践
unachang113
4
2.9k
The Past, Present, and Future of Enterprise Java with ASF in the Middle
ivargrimstad
0
140
Featured
See All Featured
Designing for humans not robots
tammielis
253
25k
Building Adaptive Systems
keathley
43
2.7k
Automating Front-end Workflow
addyosmani
1370
200k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
The Art of Programming - Codeland 2020
erikaheidi
56
13k
Code Review Best Practice
trishagee
70
19k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
850
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
GraphQLの誤解/rethinking-graphql
sonatard
72
11k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
We Have a Design System, Now What?
morganepeng
53
7.8k
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のデファクトになったとしても必ず対応し ます❗❗❗ 最後に宣伝
終