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)を読み込むべき)