Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
1.5k
BB流 golangci-lintのイロハ
- golangci-lintについての紹介と、BB流の使い方についてご紹介
Taisuke Okamoto
February 07, 2024
Tweet
Share
More Decks by Taisuke Okamoto
See All by Taisuke Okamoto
情熱と工夫で走り抜け! コミュニティをささえるObservability実践録
b1gb4by
1
440
Rancherと出会って - BB流 初心者でもわかる、虜になる瞬間
b1gb4by
0
250
リアルイベントのパワー! オフラインイベントの不思議な魅力に迫る
b1gb4by
0
2.7k
CloudNative Daysを支える Observabilityの取り組み 2023年度編
b1gb4by
0
200
Other Decks in Technology
See All in Technology
AgentCore BrowserとClaude Codeスキルを活用した 『初手AI』を実現する業務自動化AIエージェント基盤
ruzia
7
820
20251219 OpenIDファウンデーション・ジャパン紹介 / OpenID Foundation Japan Intro
oidfj
0
390
20251222_next_js_cache__1_.pdf
sutetotanuki
0
110
1人1サービス開発しているチームでのClaudeCodeの使い方
noayaoshiro
2
550
Kiro を用いたペアプロのススメ
taikis
4
1.4k
さくらのクラウド開発ふりかえり2025
kazeburo
2
190
Connection-based OAuthから学ぶOAuth for AI Agents
flatt_security
0
250
AWSの新機能をフル活用した「re:Inventエージェント」開発秘話
minorun365
2
320
NIKKEI Tech Talk #41: セキュア・バイ・デザインからクラウド管理を考える
sekido
PRO
0
190
子育てで想像してなかった「見えないダメージ」 / Unforeseen "hidden burdens" of raising children.
pauli
2
310
20251218_AIを活用した開発生産性向上の全社的な取り組みの進め方について / How to proceed with company-wide initiatives to improve development productivity using AI
yayoi_dd
0
580
プロンプトやエージェントを自動的に作る方法
shibuiwilliam
15
16k
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
432
66k
Utilizing Notion as your number one productivity tool
mfonobong
2
180
Navigating Team Friction
lara
191
16k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
200
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
0
99
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
115
91k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
710
Deep Space Network (abreviated)
tonyrice
0
20
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
Designing for Performance
lara
610
69k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.1k
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/ まとめ