はじめに
みなさん、こんにちは。Happiness Chainメンターのryoです。
今回は、Ruby、Python初学者向けに、LinterとFormatterの重要性と、どのLinterとFormatterを入れればよいか、またVSCodeを使用している人向けに、VSCode上でRuby、PythonのLinterとFormatterを動作させる環境構築手順をお話します。
Linter、Formatter、コーディング規約について
Linterはコードのバグや構文エラー、一部不適切なコーディングスタイル(コードの見た目)、お作法を検出するライブラリです。通常RubyやPythonはコードを実行しないとエラーを検出できないですが、実行前にエラーを検出することができます(静的解析)。
Formatterはコーディングスタイルをチェックして、自動整形するライブラリになります。
改行の挿入やスペースの有無等を自動整形するので、見た目がとても良くなります。
コーディングスタイルやお作法に関するチェックは、コーディング規約に従ってチェックするものになります。
コーディング規約とは、コードの書き方のルールで、調べると言語ごとに多くのコーディング規約があるかと思います。
どのコーディング規約を選択すればよいかも大事なのですが、一番大事なのはコードに一貫性をもたせることです。
例えば、このファイルではインデントせずに記述しているのに、別のファイルではインデントして記述している等、一貫性がないと見通しの悪いコードに見えます。チームで開発する場合はそれが顕著になります。ですので、コーディング規約を決めて、LinterやFormatterを入れて、自動検出、自動整形する仕組みづくりは非常に大切です。
LinterとFormatterは各言語にてライブラリがあり、それをインストールしてコマンドを実行することで自動検出、自動整形することができます。
VSCodeでは、ファイル保存を行った際に自動検出、自動整形させる環境を作ることができます。
RubyのLinterとFormatterの導入手順
RubyのLinterとFormatterに関しては、RuboCop一択です。いくつかのRubyの現場を見てきましたが、すべてRuboCopを使用していました。
RuboCopはLinterとFormatter両方の役割を担います。ただ、デフォルトのコーディング規約が厳しいので、その場合はプロジェクトルートに.rubocop.yml
を作成して、その中にカスタムルールを記述します。一部ルールを緩和したり、特定のファイルを除外したりすることが一般的です。
RuboCopのGemをインストールしましょう。
Railsアプリを開発している場合は、Gemfile
に以下を追記して、bundle install
しましょう。
...
group :development, :test do
...
+ gem 'rubocop', require: false
end
コーディング規約のカスタマイズに関しては、まずターミナルにて以下のコマンドを叩きましょう。
$ bundle exec rubocop --auto-gen-config
上記のコマンドにて、.rubocop.yml
と.rubocop_todo.yml
というファイルが自動生成されるかと思います。また、ターミナル上にデフォルトのコーディング規約の設定一覧が表示されるかと思います。そちらをコピーして、そのまま.rubocop.yml
に貼り付けることで、デフォルトのコーディング規約をそのまま使うことができ、カスタムしたい場合は、特定のルールの部分を編集すればOKです。
これで以下のコマンドを叩くことで、Linterとして違反を出力してくれます。
$ bundle exec rubocop
また、-a
のオプション付与にて自動整形してくれます。
$ bundle exec rubocop -a
VSCodeへのRuboCopの導入手順
基本的な拡張機能として、以下のRuby
を入れている方も多いかと思います。
こちらはVSCode公式にて非推奨となっており、Ruby
はアンインストールして、代わりに以下のRuby LSP
をインストールしましょう。
そして、VSCodeの設定ファイルであるsettings.json
を開きましょう。
settings.json
は、左下の歯車アイコン -> Settins -> 右上の一番左のアイコンをクリックすることで開くことができます(もしプロジェクトごとに設定したい場合は、プロジェクト直下に.vscode/settings.json
を作成して、そちらに以下の内容を記述してください)。
settings.json
に以下を追記しましょう。
"rubyLsp.formatter": "rubocop",
"rubyLsp.rubyVersionManager": {
"identifier": "auto"
},
"[ruby]": {
"editor.defaultFormatter": "Shopify.ruby-lsp",
"editor.formatOnSave": true
}
これでVSCode上にてRubocopによるLinter、Formatterが動作するかと思います。
PythonのLinterとFormatterの導入手順
Pythonに関しては、LinterとFormatterの選択肢がいくつかあるのですが、最も現場で使用されているものは以下になります。
- Linter: Flake8
- Formatter: Black
上記の導入方法をお話します。
Djangoアプリを開発している場合は、
requirements.txt
に以下を追記して、pip install -r requirements.txt
を実行しましょう。
flake8
black
そして、プロジェクト直下に.flake8
とpyproject.toml
というファイルを作成しましょう。
[flake8]
max-line-length = 88
[tool.black]
line_length = 88
上記は各設定ファイルで、flake8の設定を変更したい場合は.flake8
を、blackの設定を変更したい場合はpyproject.toml
を編集してください。
(今回は最大文字数を変更しており、flake8はデフォルトで79字、blackはデフォルトで88字なので、blackに合わせています)
flake8のチェックは以下のコマンドにてできます。
$ flake8
blackの自動整形は以下のコマンドにてできます。
$ black .
VSCodeへのFlake8、Blackの導入手順
まずは、Flake8
という拡張機能を入れましょう。
次にBlack Formatter
を入れましょう。
settings.json
に以下を追記しましょう。
"pylint.enabled": false,
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
"editor.formatOnSave": true
},
"flake8.args": ["--config=.flake8"],
"black-formatter.args": ["--config", "pyproject.toml"]
これでVSCode上にてFlake8とBlackが動作するかと思います。
終わりに
いかがだったでしょうか?
レベルの高い現場では必ずLinterとFormatterを入れています。ポートフォリオ作成時にLinterやFormatterを入れることで、他の就活生と差別化になりますので、是非参考にしてください!
参考