pockestrap

Programmer's memo

PicoRubyアプリケーションをSteepで型検査する

PicoRubyアプリケーションをSteepで型検査するためのgem, steep-picoruby をリリースしました。

github.com

問題

PicoRubyが提供するソースコードは、RBSで型定義が書かれており、Steepで型検査がされています。 一方でPicoRubyを用いたアプリケーションでSteepを使って型検査をする方法は、まだ確立されているとは言えないでしょう。

PicoRubyでは、picoruby/picorubyリポジトリにコアが提供するgemやその型定義が含まれています。 アプリケーションでそれらの型定義を使いたい場合、Steepfileで必要な型定義のディレクトリを指定すれば、それを読み込むことができます。

とはいえその作業は簡単ではありません。自分のアプリケーションがどのgemに依存しているのかを自分で判断する必要があるためです。 picoruby-gpioただ1つに依存している、といった状況であれば簡単ですが、複数のgemに依存しており、またgemが更に依存を持つようなケースではSteepfileをメンテナンスするのが難しくなるでしょう。

steep-picoruby

steep-picoruby gemはこの問題を解決します。

steep-picorubyはSteepfilepicoruby_libraryメソッドを追加します。 このメソッドはアプリケーションのビルド設定ファイルを読み込み、依存しているgemを全て列挙します。そして、SteepでそれらのRBSファイルを読み込むように設定します。

使用例

最小の設定例は以下のようになります。なお、この設定はlib/picorubyにpicoruby/picorubyがgit cloneされていることと、build_config/下にこのアプリケーションのビルド設定ファイルが置かれていることを前提としています。

# Steepfile

require 'steep/picoruby'

target :lib do
  picoruby_library

  check 'mrblib'  # アプリケーションのソースコード
  signature "sig"  # アプリケーションの型定義ファイル
end

また、R2P2で動作するコードがRubyで書かれている場合は、以下のように設定すると良いでしょう。この場合もpicoruby/picorubyリポジトリのgit cloneが必要です。

この例はRaspberry Pi Pico2 をターゲットとしているケースなので、Pico Wなどを対象とする場合は適宜読み替えてください。

require 'steep/picoruby'

target :lib do
  picoruby_library(
    target: 'r2p2-picoruby-pico2',
    build_config: 'lib/picoruby/build_config/r2p2-picoruby-pico2.rb',
  )

  check 'mrblib'  # アプリケーションのソースコード
  signature "sig"  # アプリケーションの型定義ファイル
end

詳細な使い方はsteep-picorubyのREADMEをご覧ください。picoruby_libraryの引数の説明や、複数のビルドターゲットを設定する方法を説明しています。

なお、picoruby/picoruby#389のコミットが取り込まれた後のコミットを参照することをおすすめします。このコミットがなくても動きますが、一部のgemの型定義がうまく動かないことがあります。


最近PicoRubyでアプリケーションを実装していて1、Steepによる型検査を行うためにこのgemを作りました。steep-picorubyは実際に手元でも問題なく動作しており、型検査の恩恵を受けられています。

ぜひSteepをPicoRubyアプリケーションでも使ってもらえると嬉しいです。


  1. このアプリケーションの方も近々公開できるといいな。