はじめに
先日、Ruby のプロジェクトを Steep で型チェックできるようにしたのですが、必要な知識や手順がそこそこあったので、それらをまとめました。
全体像が知りたい方向けの記事です。手順の詳細などはかなり省いています。
この記事を読んでほしい人:
- 過去の自分
- 型チェックできるようにしたいけど、何からやればいいかわからない人
知識
RBS, gem_rbs_collection, steep のそれぞれについてある程度知識があると、スムーズに型チェックを導入できます。それぞれ簡単に説明します。
RBS
RBS は Ruby 3.0 で追加された Ruby で型を扱うための機能です。
少しややこしいですが、Ruby の型を記述するための記法としての「RBS言語」があり、その記法で書かれた型情報のファイルが「RBSファイル」(拡張子は .rbs
)、そして、それらを処理する rbs
gem や rbs
コマンドがあります。
gem_rbs_collection
様々な gem の RBSファイル(型情報)がまとまっている以下のリポジトリです。
TypeScript における DefinitelyTyped のようなものです。
プロジェクトで使用している gem の型が欲しいときに使用します。
Steep
RBSファイルに書かれた型情報を使って型チェックを行うツールです。
手順
上記で説明した通り、Steep で型チェックを行うためには、型情報が書かれたRBSファイルが必要です。
そのため、型チェックできるようにするためには「必要なRBSファイルの準備」と「Steepが RBS ファイルを認識するように設定」が必要です。それぞれ説明していきます。
必要なRBSファイルの準備
型の情報が書かれたRBSファイルは、「標準ライブラリの型」「プロジェクトで使用している gem の型」「自分が書いたプログラムの型」それぞれ異なる場所にあります。
- 標準ライブラリの型
- rbs gem で定義されていて、rbs gem が Ruby に含まれています。
- プロジェクトで使用している gem の型
- gem 側で定義されている場合は
bundle install
のときに一緒にインストールされます。 - gem 側で定義されていない場合でも gem_rbs_collection にあれば、それを使うことができます。
- 自分でRBSファイルを作成することも可能です。
- gem 側で定義されている場合は
- 自分が書いたコードの型
- 自分で生成する必要があります。
- 生成の方法は
rbs prototype
コマンド、TypeProf、rbs-inline など、様々です。- RubyKaigi 2024 で話題になった rbs-inline は個人的におすすめです。
Steep が RBS ファイルを認識するように設定
steep gem をインストールしたのち、steep init
を実行すると、 Steepfile
というファイルが生成されます。このファイルに設定を書いていきます。
target :lib do
signature 'sig'
check 'app'
library 'time'
library 'uri'
end
主に以下を設定します。
-
signature
- 生成したRBSファイルが置いてあるディレクトリを指定します。
-
check
- Steepで型チェックしたいRubyのコードが含まれるディレクトリを指定します。
-
library
- 組み込みライブラリ以外の標準ライブラリを使う場合、そのライブラリの型を使ってチェックするために必要です。
- 例:
Time.now
は組み込みライブラリなのでlibrary
の指定は不要。require 'time'
することで使えるようになるTime#iso8601
はlibrary 'time'
を書かないと、型を使用できない。
- 例:
- (プロジェクトで使用している gem を
library
に指定する方法もあるっぽいです)- gem_rbs_collection を使っている場合は不要かも?
- 使い方がわかったら追記します。
- 組み込みライブラリ以外の標準ライブラリを使う場合、そのライブラリの型を使ってチェックするために必要です。
Steepfile が適切に設定できていれば、steep check
で型をチェックできます。
おわりに
自分が開発していた Ruby プロジェクトでようやく steep check
コマンドが動くようになったので、現時点で理解した内容をまとめました。追加でわかったことがあったら追記します。