RubyMine 2023.3系から、rails routes を便利に扱える Railways プラグインが動かなくなったので、代替プラグイン Railroads を作りました

JetBrainsのIDE (IntelliJ IDEA Ultimate や RubyMine) で Rails アプリ開発をする場合、 Railways プラグインが手放せません。
Railways - RubyMine Plugin | Marketplace

 
上記のプラグインページにあるように、Railwaysには

  • rails routes の結果を一覧化する
    • パスとコントローラが紐づいていない場合は、 ? アイコンが表示される
  • 一覧から行を選択後、Actionに表示されているコントローラをクリックすると、そのコントローラが含まれるファイルが開く
  • コンテキストメニューから、パスや名前をコピーする

などの機能があります。

これらのおかげで、Railsアプリ開発を効率的に進めることができていました。

 
そんな中、RubyMineを 2023.3系にバージョンを上げたところ

Not compatible with the version of your running IDE (IntelliJ IDEA 2023.3.5, RubyMine 2023.3.5)

というメッセージが表示され、Railwaysプラグインがインストール・実行できなくなりました。

 
また、Githubリポジトリを見たところ、同じ現象に対する issue が立っていました。
Update for RubyMine Versions 2023.3.2+ · Issue #58 · basgren/railways

 
以前、Railwaysプラグインがロードされないというissueには回避策がありました。
Routes window not visible in IDEA 2022.1 · Issue #54 · basgren/railways

ただ、今回はそもそもインストール自体ができないことから、回避策がない可能性も考えられました。

 
このままでは色々つらいことから、Railways の代替となるプラグイン Railroads を作り、JetBrains Marketplaceで公開しました。
https://plugins.jetbrains.com/plugin/24076-railroads

 
Railways と同じような感覚で使えます。

 
そこで、この記事では

  • Railroads プラグインを作るまでの経緯
  • 現在のバージョン 0.1.0 でサポートしている機能

などについて書いていこうと思います。  
 
目次

 

対応の検討について

対応方法としては

  • forkして修正
  • イチから作る

のどちらかを考えました。

ここでは、なぜイチから作ることにしたかを記載します。

 

forkして修正しようとしたがビルドできなかった

イチから作るのは大変な気がしたので、まずは fork して修正する方向で考えました。

 
まずリポジトリのREADMEを読んだところ

  • Current release is tested on RubyMine 2016.1, RubyMine 2016.2, IntelliJ IDEA 2016.2.
  • Development Environment
  • Building the Plugin

などが記載されていました。

 
そこで、該当バージョンのIDEJDK、各種設定を行った上でビルドしてみたものの、ビルドできませんでした。

ビルドができないことには修正もできないことから、forkして修正する方向はあきらめました。

 

イチから作る

forkして修正ができないのであれば、イチから作るしかありません。

とはいえ、それはそれで考えることがありました。

 

何を使ってプラグインを作るか

昔からあるプラグインということもあり、Railwaysプラグイン

  • 開発言語は Java
  • ビルドは Ant

を使っているようでした。

 
一方、InttelliJ Platform Pluginのドキュメントを読んだところ、最近は

という構成でも開発できそうでした。

 
どちらで作るか少々悩みましたが、Kotlinをさわってみたかったということもあり、今回は Kotlin + Gradle + Template でプラグインを作ることにしました。

 

環境づくり

都合により、開発マシンは Windows + WSL2 です。

ふつうのRailsアプリ開発であれば、上記の開発マシンでもほとんど問題なく開発ができます。

一方、 IntelliJ Platform Plugin開発中に、プラグインの動作確認のため WSL2 上でIDEを起動しようとしましたが、JetBrains Gatewayを使っているとIDEが起動しませんでした。

 
これは mac もしくは Linux を用意するしかないのか...と思いましたが、

  • RubyInstaller for Windows を使って Ruby をインストール
  • その環境で Rails をインストール

という環境を作った上で、Windows上のRubyMineで Rails アプリを作ってみたところ、 rails routes が動作しました。

今回は rails routes さえ動けばプラグインの動作確認はできることから、いったんこれで良しとしました。

 
なお、動作確認に使った Rails アプリのリポジトリは以下です。
https://github.com/thinkAmi-sandbox/rails_routes_app

 

代替プラグインの名前について

Railways プラグインの機能を実現したいことから、名前も似た感じにしようと Railroads としました。

 

Railroads プラグインの機能について

次は、最初のリリースでは Railways プラグインのどの機能を移植するか考えました。

 

最初からサポートする機能

Railways プラグインのうちどの機能がよく使われているのか分かりませんでした。

そこでまずは自分が使いたい機能をサポートしようと考え、以下としました。

  • rails routes の結果を一覧化
  • ルートとコントローラが紐づいていない場合は、 ? アイコンが表示される
  • 一覧から行を選択後、Actionに表示されているコントローラをクリックすると、そのコントローラが含まれるファイルが開く
  • コンテキストメニューから、ルートのパスや名前をコピーできる

 
これらの機能については、Railways からそのまま移植できるものは移植し、難しいものについては Kotlin で書き直しています。

 

Railwaysとは別の形でサポートする機能

rails routes 時のエラーは Notification へ通知

Railwaysでは、 rails routes 時にエラーが発生した場合、エラーのダイアログにその内容を表示していました。

ただ、まずは動くものを作ろうと考えて、現時点ではエラーが発生したら IDE の Notification へ通知するようにしています。

 

アイコンは JetBrains のものを利用

Railwaysでは、png形式で各種アイコンを用意していました。
https://github.com/basgren/railways/tree/master/src/net/bitpot/railways/icons

一方、現在では、 png 形式ではなく svg 形式が推奨されています。
https://plugins.jetbrains.com/docs/intellij/icons.html#png-format-deprecated

ただ、時間の都合上、Railwaysで使っている png 形式のアイコンを svg 形式で用意するのは難しかったことから、今のところ JetBrains で用意しているアイコンで代替しています。

 

サポートを予定しない機能

rails routesの古いフォーマット

Railways のソースコードを読んだところ、 rails routes の昔のフォーマットをサポートしていました。

ただ、手元には昔のフォーマットで出力できる環境がなかったことから、昔のフォーマットのサポートはやめることにしました。

というのも、

あたりを読むとわかるのですが、Railways では

  • rails route を実行し、標準出力に結果を出力する
  • 標準出力から文字列を取り出し、正規表現でパース
  • パースした結果をいい感じに表示する

としてルーティングの一覧を作成しています。

そのため、 rails routes で昔のフォーマットを出力する環境がないのであれば、動作確認をするのが難しいと判断し、サポート対象外としました。

 
もし、昔のフォーマットでの出力に対応したい場合は、 RubyMine の古いバージョン + Railways プラグインを使ったほうが、機能は豊富だし適切だろうと考えています。

 

将来、必要に応じてサポートできればいいなと思う機能

Railways は機能豊富なため、それをはじめから全部移植するとプラグイン開発が終わりそうにもありませんでした。

そこで、最初のリリースでは自分が必要な機能だけに絞り実装しました。

 
そのため、以下のように「あると便利だけど、なくても何とかなるかも」という機能については、必要になった時点で実装・サポートする予定です。

 

ToolWindowを開いた時点で rails routes を実行する機能

Railways では実現できています。

ただ、 Railroads で実現するには「どのタイミングで rails routes をバックグラウンドで実行するのが良いか」がまだつかめていないことから、未実装となっています。

 

rails routes 結果のキャッシュ機能

こちらも Railways では実現できています。

ただ、

  • どのキャッシュ機構を使うのが適切か
  • キャッシュのリセットや追加はどのタイミングで行うのが適切か

など、まだ分からないことがあるため、実装していません。

 

environment やタスク名などのカスタマイズ機能

今のところはデフォルトの environment やタスク名でしか実行できません。

そのため、Railways同様、設定画面を用意して、カスタマイズされた環境でも実行できるようにできればいいなと考えています。

 

コードエディタでのナビゲーション機能

Railwaysにある

Adds quick navigation to action implementation from "Routes" panel or "Go to route action" popup available in code editor

という機能です。

自分の環境で使う機会がなかったので、まだ実装していません。

 

パスを絞り込んだときのハイライト機能

Railwaysでは、検索ボックスに入力することで、パスを絞り込めます。

Railroadsでも同様の機能を用意していますが、「入力値のどの部分がパスにマッチしているか」をハイライトするような機能はありません。

ハイライトするには、以下のディレクトリにあるような機能を実装しないといけないため、今は実装を先送りしています。
https://github.com/basgren/railways/tree/master/src/net/bitpot/railways/parser/route

 

テストコードの追加

IntelliJ Platform Plugin では、プラグインに対するテストコードも書くことができるようです。
Testing Overview | IntelliJ Platform Plugin SDK

 
Railsアプリ開発では、RSpecなどを使ってテストコードを書いています。

一方、 IntelliJ Platform Pluginに対するテストコードについては、今まで書いたことがありません。そのため、テストコードをきちんと書いて進めるとした場合、完成までに時間がかかりそうでした。

 
そこで、現時点では動作確認は実機で行うものとして、テストコードの実装は先送りしました。

なお、機能が増えるなどした場合、動作確認を実機で行うほうが手間がかかりそうと考えているため、そのうちテストコードを追加したいと思っています。

 

Railroads プラグインの公開URLについて

再掲となりますが、以下のページで公開しています。
https://plugins.jetbrains.com/plugin/24076-railroads

 

ソースコード

Railroads プラグインソースコードは、Githubで公開しています。
https://github.com/thinkAmi/railroads

まだまだ荒削りなプラグインですので、使ってみて何か気になることがありましたら、Githubのissueなどで情報を共有していただけるとありがたいです。

 
また、動作確認で使っている Rails アプリは以下で公開しています。
https://github.com/thinkAmi-sandbox/rails_routes_app