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
BB流 golangci-lintのイロハ
Search
Taisuke Okamoto
February 07, 2024
Technology
1
840
BB流 golangci-lintのイロハ
- golangci-lintについての紹介と、BB流の使い方についてご紹介
Taisuke Okamoto
February 07, 2024
Tweet
Share
More Decks by Taisuke Okamoto
See All by Taisuke Okamoto
Rancherと出会って - BB流 初心者でもわかる、虜になる瞬間
b1gb4by
0
110
リアルイベントのパワー! オフラインイベントの不思議な魅力に迫る
b1gb4by
0
1.8k
CloudNative Daysを支える Observabilityの取り組み 2023年度編
b1gb4by
0
100
Other Decks in Technology
See All in Technology
Storage Browser for Amazon S3
miu_crescent
1
210
ブラックフライデーで購入したPixel9で、Gemini Nanoを動かしてみた
marchin1989
1
540
Google Cloud で始める Cloud Run 〜AWSとの比較と実例デモで解説〜
risatube
PRO
0
110
20241214_WACATE2024冬_テスト設計技法をチョット俯瞰してみよう
kzsuzuki
3
530
Snykで始めるセキュリティ担当者とSREと開発者が楽になる脆弱性対応 / Getting started with Snyk Vulnerability Response
yamaguchitk333
2
190
コンテナセキュリティのためのLandlock入門
nullpo_head
2
320
社外コミュニティで学び社内に活かす共に学ぶプロジェクトの実践/backlogworld2024
nishiuma
0
270
watsonx.ai Dojo #5 ファインチューニングとInstructLAB
oniak3ibm
PRO
0
170
NW-JAWS #14 re:Invent 2024(予選落ち含)で 発表された推しアップデートについて
nagisa53
0
270
フロントエンド設計にモブ設計を導入してみた / 20241212_cloudsign_TechFrontMeetup
bengo4com
0
1.9k
ゼロから創る横断SREチーム 挑戦と進化の軌跡
rvirus0817
2
270
LINEスキマニにおけるフロントエンド開発
lycorptech_jp
PRO
0
330
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Embracing the Ebb and Flow
colly
84
4.5k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Code Reviewing Like a Champion
maltzj
520
39k
How STYLIGHT went responsive
nonsquared
95
5.2k
The World Runs on Bad Software
bkeepers
PRO
65
11k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
Transcript
2024/02/07 【Oracle Cloud Hangout Cafe Season 8 #1 】 株式会社IDCフロンティア
岡本泰典 BB流 golangci-lintのイロハ
Agenda • WHORU? • golangci-lintってなに? • BBが思う「これはいいぞ」Linter 集 • BB流
golangci-lint の活用方法 • まとめ
岡本泰典 a.k.a BigBaBy 株式会社IDCフロンティア KaaS Engineer (Storage, Network etc...) ◆趣味
DJ、たまにVJ(Visual Jockey)もします ◆最近の出来事 Cloud Native Days Tokyo 2024 Co-chair に就任しました @taisuke_bigbaby WHORU?
本LTのgolangci-lintに関することはBB本人の経 験と調査に基づくものであり、全ての見解は、BB自 身のものです。 CAUTION
golangci-lintってなに?
• Goの便利な静的解析ツールの1つ • 1つで多くのLinterを管理・実行が可能 • 複数のLinterを並列に実行可能 • キャッシュで高速化を実現 • YAMLファイルでの設定管理
◦ TOML, JSONでも可 • 様々なエディタやIDEでサポート golangci-lint https://github.com/golangci/golangci-lint/blob /master/assets/go.png
デフォルトで有効化されているLinter Description Preset 未チェックエラーをチェックする bugs, error Linter errcheck gosimple govet
ineffassign staticcheck unused 不要なコードを簡素化してくれる style コンパイラとは別の観点でチェックを行い サジェストをしてくれる bugs, metalinter 不要な代入をチェック unused govetよりも包括的にチェックを行う bugs, metalinter 未使用の変数や定数、関数や型などをチェック する unused
• 下のコマンドを実行するだけで良い 一般的な操作 # 設定ファイルがない場合、全てデフォルトの設定値で実行 # 実行したディレクトリ直下に設定ファイルがある場合、そのファイルを参照 $ golangci-lint run
• --fix オプションをつけることで自動的に修正 # Auto Fixに対応しているLinterにのみ有効 $ golangci-lint run --fix
設定ファイルの構成 run: # golangci-lintの実行に関する設定 option: value output: # 出力時の設定 option:
value linters-settings: # Linter固有の設定 option: value linters: # 使用するLinterに関する設定 option: value issues: # Linterの報告に関しての設定 (特定の報告を無視するなど) option: value severity: # issuesに対する重要度の設定 option: value
Field: run (一部抜粋) • concurrency ◦ 実行時に使用するCPU数 (Default: マシンの論理CPU数) •
timeout ◦ タイムアウト時間 (Default: 1min) • tests ◦ テストファイル(XXX_test.go)を解析に含むかどうか (Default: true) • skip-dirs / skip-files ◦ 除外するディレクトリ・ファイルの設定 (Default: []) • allow-parallel-runners ◦ 並列実行の可否 (Default: false) ▪ デフォルトでは、シーケンシャルな実行を行っている • go ◦ Goのバージョン制御を行う
Field: output (一部抜粋) • format ◦ 出力時の形式を設定 (Default: colored-line-number) ▪
line-number, json, colored-tab, tab, checkstyle, code-climate, junit-xml, github-actions, teamcity ◦ カンマ区切りで複数指定することができ、フォーマット名とパスをコロン記号で区切る ことで、それぞれに出力を与えることができる output: format: checkstyle:report.xml, json:stdout, colored-line-number
Field: linters • disable-all ◦ すべてのLinterを無効化 (Default: false) • enable-all
◦ すべてのLinterを有効化 (Default: false) • enable ◦ 指定したLinterを有効化 • disable ◦ 指定したLinterを無効化 • presets ◦ Preset別にLinterを有効化 • fast ◦ 有効化されたLinterから実行結果が早かったもののみを実行する (Default: false) ▪ なので、最初の実行は高速にならない
Field: linters-settings • Linterごとの固有の設定を記述 ◦ 詳しい設定は公式ドキュメントを参考にするのが良い ▪ Linters | golangci-lint
Field: issues (一部抜粋) • exclude ◦ 特定の文言を含むissueを無視する • exclude-rules ◦
path ▪ 特定のLinterを指定したファイルには実行しない ◦ path-except ▪ 特定のLinterを指定したファイル以外には実行しない ◦ text ▪ 特定のLinterの文言を含むissueを無視する ◦ source ▪ 特定のLinterの箇所のissueを無視する • 例: ^//go:generate
Field: severity (一部抜粋) • default-severity ◦ issueのデフォルトの重大度を設定する (Default: "") ◦
深刻度のルールが定義されており、問題が一致しない場合やルールに深刻度が提供さ れていない場合は、これが適用されるデフォルトの深刻度になる • rules ◦ Linterごとにseverityを設定可能 severity: rules: - linters: - dupl severity: info
BBが思う「これはいいぞ」Linter 集
gofumpt • gofmtをもう少し厳格化したLinter ◦ ただし、gofmtと後方互換性をもっているgofmtとの違い ◦ 1. フォーマットのスタイル ▪ Goの公式のformatterに厳格で一貫性のあるスタイルルールを追加している
◦ 2. セミコロンの自動挿入は行わない ▪ Goのコーディングスタイルではセミコロンを明示的に記述する必要がないため ◦ 3. インポート文の整理 ▪ インポート文を整理し、アルファベット順に並べ替える ▪ また、不要なインポート文を削除する ◦ 4. スペースの挿入と削除 ▪ コード内のスペースの挿入と削除を行い、一貫性のあるスペースの配置を確保する • Auto Fixに対応
gci • goimportsと同じで、Goパッケージのインポート順序を制御 ◦ 結果が一意に決定される • Auto Fix対応 package main
import ( "fmt" go "github.com/golang" _ "github.com/golang/blank" . "github.com/golang/dot" "github.com/daixiang0/gci" _ "github.com/daixiang0/gci/blank" . "github.com/daixiang0/gci/dot" ) package main import ( "fmt" go "github.com/golang" "github.com/daixiang0/gci" _ "github.com/daixiang0/gci/blank" _ "github.com/golang/blank" . "github.com/daixiang0/gci/dot" . "github.com/golang/dot" )
その他のBBおすすめLinter • dupl ◦ 重複しているコードを検知し、冗長化を防ぐ • misspell ◦ スペルミスを検知 (Auto
Fix対応) ▪ localeのオプションはUSとUKを選べるが、USでいいかも? • unconvert ◦ 不要な型の変換を検知 • whitespace ◦ 関数や、if文、for文などに不要な改行がないかを検知 • go-critic ◦ 「これでもか!」ってくらいに解析をしてほしい人向け ◦ より細かい範囲まで検知をおこなってくれます
BB流 golangci-lint の活用方法
• 基本的に、デフォルトで有効になっているLinterはそのままでいい ◦ ソフトウェア品質を担保するためのツールは十二分に用意されている まず、「郷に入っては郷に従え」(Goだけに)
◦ GitHub Actionsの場合 ▪ GitHubではすでにプラグインが存在しているため導入も簡単 • キャッシュなども設定でよしなに設定してくれるので楽ちん ▪ 下図のような感じでUIでもわかりやすく検知箇所を教えてくれる CIには必ず組み込むべし
https://github.com/golangci/golangci-lint-action/blob/master/static/annotations.png
• 様々なエディタに簡単に組み込むことが可能 • VSCodeの場合 ◦ プロジェクト配下に.vscodeディレクトリを作成し、以下のsetting.jsonを追加 ▪ チームでの検知差分をなくす ローカルとCIの環境は統一化する {
"go.lintTool": "golangci-lint", "go.lintFlags": [ "--config=${workspaceFolder}/.golangci-lint.yaml", "--fast" ] }
◦ //nolintって? ▪ golangci-lintにおいて記述した箇所の検知を無視することができる • 「//nolint:linter」で特定のLinterのみ無視することも可能 ◦ ただ、むやみにつけることは良くない ▪ nolintの記載した理由は明記しておくことがベスト
• 「やむを得ない」ときに使いましょう ◦ nolintを付与するときの基準 ▪ 意図的な例外 ▪ 外部ライブラリや自動生成コードの適用 //nolintはむやみに使わない
◦ メンバーとの検知差分をなくすため、ファイルは必ず作成したほうが良い ◦ 最初の linters-settings の設定は最低限で ▪ 使用していく中で、各Linterをチューニングしていくのが良い ◦ disable-all
VS enable-all ▪ disable-all • 必要最低限のLinterを絞りたい人はオススメ • 既存のバグの修正等のみを求める場合は、この設定でOK ▪ enable-all • 新しいLinterを積極的に使いたい • ただし、アップデート時の追従は少し辛さを感じることも... 設定ファイルはシンプルに
まとめ
◦ まずは触ってみよう ▪ デフォルトの設定のままでも良い ◦ Linterにも似たものはたくさんある ▪ デフォルトのLinterは厳格なものはあまり入っていない ▪ チーム、環境にあった強度のものを選ぶのが良い
◦ Linterに興味を持った方 ▪ ぜひ自分で作成してみましょう!! • https://tenntenn.dev/ja/analysis/ まとめ