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

# はじめに

みなさん、こんにちは。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`しましょう。

```diff:Gemfile
...
  group :development, :test do
    ...
+   gem 'rubocop', require: false
  end
```

コーディング規約のカスタマイズに関しては、まずターミナルにて以下のコマンドを叩きましょう。
```shell:ターミナル
$ bundle exec rubocop --auto-gen-config
```
上記のコマンドにて、`.rubocop.yml`と`.rubocop_todo.yml`というファイルが自動生成されるかと思います。また、ターミナル上にデフォルトのコーディング規約の設定一覧が表示されるかと思います。そちらをコピーして、そのまま`.rubocop.yml`に貼り付けることで、デフォルトのコーディング規約をそのまま使うことができ、カスタムしたい場合は、特定のルールの部分を編集すればOKです。

これで以下のコマンドを叩くことで、Linterとして違反を出力してくれます。
```shell:ターミナル
$ bundle exec rubocop
```

また、`-a`のオプション付与にて自動整形してくれます。

```shell:ターミナル
$ bundle exec rubocop -a
```

### VSCodeへのRuboCopの導入手順

基本的な拡張機能として、以下の`Ruby`を入れている方も多いかと思います。
![ruby_extension.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634526/cc9b0318-4136-6fa1-6b23-49ef52feca4c.jpeg)


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

![ruby_lsp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634526/42b8b74b-231b-d103-30ac-bf22f127ea9a.jpeg)

そして、VSCodeの設定ファイルである`settings.json`を開きましょう。
`settings.json`は、左下の歯車アイコン -> Settins -> 右上の一番左のアイコンをクリックすることで開くことができます（もしプロジェクトごとに設定したい場合は、プロジェクト直下に`.vscode/settings.json`を作成して、そちらに以下の内容を記述してください）。
![open_settingsjson.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634526/6895fbee-26a1-7187-38f2-84ae9af091b7.jpeg)

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

```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
[flake8]
max-line-length = 88
```

```toml:pyproject.toml
[tool.black]
line_length = 88
```

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

flake8のチェックは以下のコマンドにてできます。
```shell:ターミナル
$ flake8
```

blackの自動整形は以下のコマンドにてできます。
```shell:ターミナル
$ black .
```

### VSCodeへのFlake8、Blackの導入手順

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634526/10ec76d9-38b8-ddd4-85d9-57377ed8c3ca.png)

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

![black_formatter.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634526/6eefcf57-81b5-6b3a-5745-03c5c564c443.jpeg)

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

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

# 参考

https://qiita.com/sin9270/items/85e2dab4c0144c79987d

https://zenn.dev/necocoa/articles/vscode-ruby-lsp