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
380
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
custom_lintで始めるチームルール管理
Kosei Akaboshi (akaboshinit)
March 26, 2025
More Decks by Kosei Akaboshi (akaboshinit)
See All by Kosei Akaboshi (akaboshinit)
そのローカルDB、プロジェクトに合ってますか? 明日から変える最適なDB
akaboshinit
0
92
WasmがFlutter on the Webに もたらす変化
akaboshinit
0
39
Other Decks in Programming
See All in Programming
ふつうのFeature Flag実践入門
irof
7
3.6k
These Five Tricks Can Make Your Apps Greener, Cheaper, & Nicer
hollycummins
0
280
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
500
AIエージェントと協働するCLI開発 — BunとOpenClawで学んだこと
yoshikouki
1
240
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.2k
AIで効率化できた業務・日常
ochtum
0
100
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
550
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
310
Webフレームワークの ベンチマークについて
yusukebe
0
140
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
150
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
1
620
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
460
Featured
See All Featured
Music & Morning Musume
bryan
47
7.2k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
250
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
200
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
570
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
210
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
300
WCS-LA-2024
lcolladotor
0
620
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
380
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
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のデファクトになったとしても必ず対応し ます❗❗❗ 最後に宣伝
終