前置き
gemを作る時にはだいたい最初に bundle gem
コマンドでgemの雛形を作りますが、最近のbundlerだと sig/
(rbsファイルを格納するディレクトリ)とrbsファイルの雛形も作られるようになっています。
最近作った https://github.com/sue445/doorkeeper_jp でrbsをいい感じにCIするところまで持っていけたのでメモ。
やったこと
gem_rbs_collectionをsubmoduleとして追加する
https://github.com/ruby/gem_rbs_collection のREADMEに書かれているようにsubmoduleとして追加。
gemにsubmoduleを追加すると rake build
した時に作られるgemファイルにも含まれないか心配だったのですが、調べたところsubmoduleの中身は含まれなかったのでgem_rbs_collectionを追加することで配布するgemファイルが肥大化することはなさそうです。
手元でrbs validateを叩けるようにする
Rakefile
に下記のようなtaskを追加。 *1
desc "validate rbs" task :rbs_validate do command = %w( rbs --repo vendor/rbs/gem_rbs_collection/gems/ -r date -r forwardable -r uri -r faraday:2.5 -r hashie:5.0 -I sig/ validate --silent ).join(" ") sh command end
-r
でrequireするものは作るgemによって変わりますが他の部分はだいたい使いまわしでよさそう。 -r
を個別指定するのが面倒なんだけど今の所他にいい方法は見つからなかった...
CIでrbs validateを実行する
さっき追加した rake rbs_validate
をGitHub Actionsのworkflowで実行
*2
こんな感じ。
- run: bundle exec rake rbs_validate
submoduleとしてgem_rbs_collectionをdependabotで定期更新する
.github/dependabot.yml
に下記のようなファイルを追加 *3 することでDependabotでsubmoduleも定期的に更新してくれるようになります。
version: 2 updates: - package-ecosystem: gitsubmodule directory: "/" schedule: interval: monthly
interval(daily or weekly or monthly)は適当なので適宜変えてください。
実際にDependanotでgem_rbs_collectionを更新した時のPRはこちら
*1: https://github.com/sue445/doorkeeper_jp/blob/50b8c1d0443c57e2d32c1256338791581d8dfebd/Rakefile#L8-L24
*2: https://github.com/sue445/doorkeeper_jp/blob/50b8c1d0443c57e2d32c1256338791581d8dfebd/.github/workflows/test.yml#L46
*3: https://github.com/sue445/doorkeeper_jp/blob/50b8c1d0443c57e2d32c1256338791581d8dfebd/.github/dependabot.yml