linter for your team rule

03518666631462b711589a1b8c4048a2?s=47 mizkei
November 09, 2018

linter for your team rule

03518666631462b711589a1b8c4048a2?s=128

mizkei

November 09, 2018
Tweet

Transcript

  1. プロジェクトのルールを チェックするためのlint mercari.go#4

  2. 目次 • 自己紹介 • golint • チームで取り入れたいルール • テストのために取り入れたいルール •

    パッケージの役割を分けるために取り入れたいルール • ルールをチームで共有する方法 • ルール表現のために作成したツール「self-lint」 • まとめ
  3. 自己紹介 • 名前 ◦ 水野 敬太 • github ◦ mizkei

    • twitter ◦ @mizkei11 • 仕事 ◦ Backend/マイクロサービス開発
  4. golint

  5. golintによるコーディングスタイルの指摘 • Effective Go や Go Code Review Comments に基づいた指摘

    ◦ 不要なelse ◦ コメントのフォーマット ◦ context.WithValueのkeyの型 ◦ 変数・パッケージ名 ◦ import Dot ◦ main以外でのblank import ◦ ...
  6. golintによるコーディングスタイルの指摘 • プロジェクトにおけるコードの書き方がある程度統一される • エディタの設定をすれば、編集しながら確認可能 • reviewdog にログを食べてもらえば、github上でも指摘される 綺麗なGoのコードを書くためのルールとしては非常に有用だが、 チームのローカルルールが欲しい場合もある

  7. チームで取り入れたいルール

  8. 特定パッケージのimport制限 • Assertなどを提供する外部パッケージ ◦ Why does Go not have assertions?

    • プロジェクトにおけるテスト用パッケージ ◦ e.g. githoge.com/project/root/test ◦ テスト用のデータを用意するための便利メソッド群 ▪ 複数パッケージのテストで参照されるために一つのパッケージとして作成
  9. プロジェクトにおけるテスト用パッケージ • テスト用のmock ◦ テストではないパッケージに含めたくない ▪ package modelをimportしてしまえば誰でも使えてしまうため • テストデータ作成便利メソッド

    ◦ *intなどを各パッケージのテストで書いていると手間がかかる
  10. プロジェクトにおけるテスト用パッケージ

  11. テストのために取り入れたいルール

  12. 特定メソッド・変数への参照制限 • テストのための時間停止用メソッドなど ◦ メソッドとして用意しない方法もあるが、テストが一手間増える ◦ 手間をかけないために楽をしたときにできてしまう副産物を テスト以外では利用できないようにしたい

  13. テスト用に時間を停止するメソッド • 現在時刻による動作の差異がある場合をテストする時の方法 ◦ Now() time.Timeを実装したインターフェースを渡せるようにする ▪ テスト用に各種パッケージにインターフェースを渡すのが手間 ◦ グローバルにtime.Nowへの参照を持ったパッケージを作成して、

    現在時刻取得はそのメソッドから行い、テスト時に差し替える ▪ テスト時に差し替える用のメソッドは `*_test.go` から参照できる必要があるため Publicなメソッドにしなければならない
  14. 現在時刻を差し替える(interface版) • interfaceを渡すべき構造体が複数ある場合など、テストでの管理が面倒

  15. 現在時刻を差し替える(global書き換え版) • build tagsを記述したファイルのみにメソッドを定義した場合、 エディタのlint設定も変更しなければならない • タグがなければ、差し替えるメソッドは機能しないが、差し替えるメソッドを TestGoFiles, XTestGofiles以外で参照することすらあってほしくはない

  16. パッケージの役割を分けるために取 り入れたいルール

  17. 特定builtin機能の制限 • panic書く機会はほぼないため禁止してしまいたい ◦ web application書いているときなど • データの構造についてのみ記述するためのパッケージで条件分岐など不要 ◦ e.g.

    githoge.com/project/root/data ◦ 構造体の定義だけ記述されていたり、 値を詰め込むだけのメソッドしか存在してほしくない
  18. ルールの共有方法

  19. チームでのルールの共有方法 • Wikiにまとめる ◦ 更新され続ける保証はない ◦ 読まないで書いてくる人いるかも ◦ レビューで指摘するとして、チームに入ってからの歴が浅いと 見逃してしまう可能性がある

    人がチェックすると見逃す可能性を排除することはできないので、 チームルールを自動的にチェックするためのツールが欲しい
  20. 「self-lint」

  21. self-lint • https://github.com/mizkei/self-lint • チームでの禁止事項(ローカルルール)をチェックするためのツール ◦ 特定importのチェック ◦ 特定packageのメソッドや変数への参照 ◦

    panicなどのbuiltin functionの使用 • CIを利用した自動チェック ◦ golintと同じ出力形式であるため、reviewdogが食べてくれる
  22. self-lintの設定 • target ◦ 対象のパッケージ ▪ globalは全てのパッケージ • import ◦

    禁止したいパッケージを書く • ref ◦ 禁止したいパッケージの値を書く • write ◦ 禁止したいbuiltin functionを書く ▪ panic, if, switch, or for
  23. 特定importのチェック • テストファイル以外でtestパッケージはimportしてはいけない

  24. 特定パッケージの値への参照 • テスト用に作成されたメソッドを テストファイル以外で参照してほしくない

  25. 特定のbuiltinやstatementsの利用 • データを定義しているだけのパッケージでpanicしてほしくない

  26. まとめ • lintに加えて、チームでの開発において、更に制限が欲しくなる場合に ついて述べた • チームとして設定した制限を自動チェックするために self-lintというツールを作成した