MJHD

エモさ駆動開発

Railsにsorbetインストールしてみた with LSP

Rubyの静的型チェッカー、「Sorbet」がオープンソース化された。
LSPも実装されており、これだけRubyもシェアがあるので、覇権を握れるのでは。
手元にちょうど良いRailsプロジェクトが合ったため、導入してみた。

Sorbetのインストール

ここではあまり詳しく説明しないが、基本的には公式ドキュメントのGetting Started通りに進めていく。
Gemfileに追記し、bundle install、srb initをするぐらいで一瞬で終わった。

デフォルトではファイルの先頭に

# typed: false

と書いてあるため、型チェックはされない。
試しにここを

# typed: true

に変更してみると、例えばRailsのControllerなどでは大量にエラーが出るはず。

これは、Railsが実行時にroutingなど動的に様々なシンボルを生成しているためで、このままだと使い物にならない…。

Rails対応

sorbet-railsというRails向けsorbetの型定義生成ツールがある。
これを入れれば一通り開発ができるようになる。

インストールはこちらもREADME通りに進め、最後に

$ srb tc --suggest-typed --typed=strict --error-white-list=7022 --autocorrect

を実行すれば型チェックが実行可能になったファイルのtypecheck level(ファイルの先頭にあるtyped)を上げてくれる。

これにより先ほどはエラーが出ていたcontrollerなども

# typed: true

となり、型チェックが通るようになる。

LSP導入

せっかく静的型付けができるようになったので、LSPによる定義へジャンプや補完、型チェックを使いたい。
LSP導入の方法は色々調べたがドキュメントが全くなく、自己流で導入した。 (おそらく今後この辺のドキュメントも揃ってくると思う)

まずは、公式レポジトリをクローンする。

$ git clone https://github.com/sorbet/sorbet

次に、README通りにbazelや必要なライブラリのインストールを行う。macユーザで今までC++で開発をしたことがないユーザは、以下のコマンドも必要かもしれない。

$ open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

準備ができたら、bazelでビルドを行う。この時、プロダクションビルドのオプションを指定する。

$ bazel build //main:sorbet --config=release-mac (またはlinux)

これにより、bazel-bin/main/sorbet というバイナリができ上がる。

このバイナリを以下のようなオプションをつけて、プロジェクトのルートで実行するとLSPとして待ち受けるようになる。

$ sorbet --disable-watchman --no-config --enable-all-experimental-lsp-features--lsp --dir .

(--no-configを設定しているが、これは簡単のためであり、本来はプロジェクトごとの設定ファイル(sorbet/config)を読み込むべき)

これをvimVSCodeに設定すれば、補完や定義へジャンプが有効になり、快適なsorbetライフが送れるようになる。