Rubyの静的型解析を試してみる
最近少しRubyの型周りの設定をしていましたのでメモ程度に残しておきます
Rubyの静的型解析の概要
Ruby 3の静的解析機能のRBS、TypeProf、Steep、Sorbetの関係についてのノート - クックパッド開発者ブログ
を参考にする。
そもそもがややこしいので頭を整理する(ただ間違いもあるかも...)
- RBS
- TypeProf
- Steep
- Sorbet
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 一辺倒なので使いませんが、VSCode 等 IDE ではまた違うかもしれません
他にも Steep 、 Sorbet の今後どうなるのか次第でも変わりそうです。せっかく採用しても選択した側が開発停止となった場合が少し面倒かもです
とは言え、まだまだこれから発展していくとは思いますので楽しみにしています