7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby,Python初学者必見】LinterとFormatterは必ず入れましょう

Last updated at Posted at 2024-11-12

はじめに

みなさん、こんにちは。Happiness Chainメンターのryoです。

今回は、Ruby、Python初学者向けに、LinterとFormatterの重要性と、どのLinterとFormatterを入れればよいか、またVSCodeを使用している人向けに、VSCode上でRuby、PythonのLinterとFormatterを動作させる環境構築手順をお話します。

Linter、Formatter、コーディング規約について

Linterはコードのバグや構文エラー、一部不適切なコーディングスタイル(コードの見た目)、お作法を検出するライブラリです。通常RubyやPythonはコードを実行しないとエラーを検出できないですが、実行前にエラーを検出することができます(静的解析)。

Formatterはコーディングスタイルをチェックして、自動整形するライブラリになります。
改行の挿入やスペースの有無等を自動整形するので、見た目がとても良くなります。

コーディングスタイルやお作法に関するチェックは、コーディング規約に従ってチェックするものになります。

コーディング規約とは、コードの書き方のルールで、調べると言語ごとに多くのコーディング規約があるかと思います。
どのコーディング規約を選択すればよいかも大事なのですが、一番大事なのはコードに一貫性をもたせることです。
例えば、このファイルではインデントせずに記述しているのに、別のファイルではインデントして記述している等、一貫性がないと見通しの悪いコードに見えます。チームで開発する場合はそれが顕著になります。ですので、コーディング規約を決めて、LinterFormatterを入れて、自動検出、自動整形する仕組みづくりは非常に大切です。

LinterとFormatterは各言語にてライブラリがあり、それをインストールしてコマンドを実行することで自動検出、自動整形することができます。

VSCodeでは、ファイル保存を行った際に自動検出、自動整形させる環境を作ることができます。

RubyのLinterとFormatterの導入手順

RubyのLinterとFormatterに関しては、RuboCop一択です。いくつかのRubyの現場を見てきましたが、すべてRuboCopを使用していました。
RuboCopはLinterとFormatter両方の役割を担います。ただ、デフォルトのコーディング規約が厳しいので、その場合はプロジェクトルートに.rubocop.ymlを作成して、その中にカスタムルールを記述します。一部ルールを緩和したり、特定のファイルを除外したりすることが一般的です。

RuboCopのGemをインストールしましょう。
Railsアプリを開発している場合は、Gemfileに以下を追記して、bundle installしましょう。

Gemfile
...
  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を入れている方も多いかと思います。
ruby_extension.jpg

こちらはVSCode公式にて非推奨となっており、Rubyはアンインストールして、代わりに以下のRuby LSPをインストールしましょう。

ruby_lsp.jpg

そして、VSCodeの設定ファイルであるsettings.jsonを開きましょう。
settings.jsonは、左下の歯車アイコン -> Settins -> 右上の一番左のアイコンをクリックすることで開くことができます(もしプロジェクトごとに設定したい場合は、プロジェクト直下に.vscode/settings.jsonを作成して、そちらに以下の内容を記述してください)。
open_settingsjson.jpg

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

そして、プロジェクト直下に.flake8pyproject.tomlというファイルを作成しましょう。

.flake8
[flake8]
max-line-length = 88
pyproject.toml
[tool.black]
line_length = 88

上記は各設定ファイルで、flake8の設定を変更したい場合は.flake8を、blackの設定を変更したい場合はpyproject.tomlを編集してください。
(今回は最大文字数を変更しており、flake8はデフォルトで79字、blackはデフォルトで88字なので、blackに合わせています)

flake8のチェックは以下のコマンドにてできます。

ターミナル
$ flake8

blackの自動整形は以下のコマンドにてできます。

ターミナル
$ black .

VSCodeへのFlake8、Blackの導入手順

まずは、Flake8という拡張機能を入れましょう。

image.png

次にBlack Formatterを入れましょう。

black_formatter.jpg

settings.jsonに以下を追記しましょう。

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を入れることで、他の就活生と差別化になりますので、是非参考にしてください!

参考

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?