Rubyの静的型解析を試してみる

最近少しRubyの型周りの設定をしていましたのでメモ程度に残しておきます

Rubyの静的型解析の概要

Ruby 3の静的解析機能のRBS、TypeProf、Steep、Sorbetの関係についてのノート - クックパッド開発者ブログ

を参考にする。

そもそもがややこしいので頭を整理する(ただ間違いもあるかも...)

  • RBS
    • Ruby の型情報を扱う言語自体。Ruby 3 からバンドルされる
  • TypeProf
    • Ruby 3 にバンドルされる。RBSファイルを生成する
    • typeprof コマンドとして実装されていて、 .rb ファイルを食わせると .rbs が生成される
  • Steep
    • RBSファイルを使用して型チェッカー。Ruby製なので動作は遅め
    • エディタの裏で動いてチェックしてエディタでエラー表示等をする
  • Sorbet
    • 役割はSteepと同じツール。Stripeが開発していてC++製なので動作が軽い
    • RBIというRBSとは異なる言語を利用する

RBSファイルの生成

RubyからRBSを生成する各方法の特徴 - pockestrap

ここが詳しかった

rbs コマンドもあるが、基本的には typeprof を利用すれば良いはず

ちなみに結構重いので注意。仕事のRailsプロジェクトで試してみたら10分どころでは無い時間が必要だった

$ typeprof hoge.rb > hoge.rbs

ちなみに Railsの場合は rbs_rails というgemを使うのが楽

Steep

設定方法は細かく書かないが最低限だけ。色々変わる可能性があるので詳しくは各自で調べてください

steep gemをインストールする

これで Steepfile が作成されるので適切に設定をする

$ steep init

RBSを作成したらチェックが可能となる

コマンドからチェックするには check で可能

$ steep check

RBSの配置

基本的には sig というディレクトリを作りその中に置けば良い

hoge.rb の場合 sig/hoge.rbs となる

初めて触った時にディレクトリ構成とかどうするべきかを悩んだが、 sig の下にディレクトリ構造も模倣すれば良いだけのようだ

hoge/fuga.rb の場合 sig/hoge/fuga.rbs となる

rbs_rails を使うと sig ディレクトリの下に自動で作成してくれるので楽でした

Vim + Steep

LSPで対応されている。

私は vim-lsp , vim-lsp-settings を使用しているので :LspInstallServer steep だけで使用できた

ただし、実際に仕事のプロジェクトを使用した場合 Vim が非常に重くなるが辛い

hijk での移動ですら止まる場合がある

設定でどうにかなるかもしれないがまだこの方法が見つからないので、ストレスなく実用レベルになるのはもう少し先かもしれない

Sorbet

Sorbet はまた違ったツールだが本質的には似ています

今現在はgem は sorbet , sorbet-runtime , typeprof が必要だが、これも将来どうなるか不明

初期化を行う。 RBI 等が生成されるようです

$ srb init

チェックは tc

$ srb tc

C++ 製だから動作は非常に軽いのが嬉しい。検索するとすでに Sorbet を現場で採用している会社もあるようでした

Vim + Sorbet

vim-lsp-settings には Sorbet が無いようです。というか vim-lsp に対応サーバがあるかも私は知りません...

感想

実際にエディタから使う場合は速度が命ですし、小さなコードやgem程度なら問題なく使えそうですが複雑なRailsアプリにはまだまだ厳しいという感覚でした

私は Vim 一辺倒なので使いませんが、VSCodeIDE ではまた違うかもしれません

他にも Steep 、 Sorbet の今後どうなるのか次第でも変わりそうです。せっかく採用しても選択した側が開発停止となった場合が少し面倒かもです

とは言え、まだまだこれから発展していくとは思いますので楽しみにしています