IntelliJ Platform Pluginの開発にて、RubyMineなどのIntelliJ IDEA以外のIDEがRun Pluginで起動するようにしてみた

IntelliJ Platform Plugin Template を使って IntelliJ Platform Pluginを開発している場合、 デフォルトでは Run Plugin すると

な状態で IDE の別インスタンスが起動します。

ただ、

などはどうすればよいか気になったことから、調べたときのメモを残します。

 
目次

 

環境

  • プラグインの開発環境
    • Widnows 11
    • IntelliJ IDEA 2023.3.4 Ultimate Edition
    • IntelliJ Platform Plugin Template 1.12.0
    • Kotlinで実装
  • 起動するIDE
    • RubyMine 2023.2.6、IntelliJ IDEA 2023.2.6 Ultimate
      • Windows上に、JetBrains Toolboxでインストール済
      • 開発環境とは異なるプラットフォームのバージョンを指定できるか確認するため、 2023.2.6 にしています

 
また、今回の実装は、前回の記事の続きとして実装していきます。
IntelliJ Platform Pluginの開発にて、Kotlin UI DSL Version 2 や Swing を使って、ToolWindow上にコンポーネントを表示してみた - メモ的な思考的な

 

起動するIDEをRubyMineに変更する

Run Scriptで起動するIDEをRubyMineへ変更する方法については、IntelliJ Platform Plugin SDKの公式ドキュメントに記載がありました。

 
これらによると、

とすれば良さそうでしたので、ためしてみます。

 

build.gradle.kts の修正

build.gradle.kts を見たところ、 intellij.plugins の設定は以下のようになっていました。

intellij {
    // ...
    // Plugin Dependencies. Uses `platformPlugins` property from the gradle.properties file.
    plugins = properties("platformPlugins").map { it.split(',').map(String::trim).filter(String::isNotEmpty) }
}

 
ソースコードのコメントに

Uses platformPlugins property from the gradle.properties file.

とあるように、定義済のキーに対する値を gradle.properties へ設定すれば良さそうでした。

 
一方、 runIde.ideDir の定義は存在しなかったため、

  • キーを末尾に追加
    • ただし、値を何も設定しない場合は、デフォルトのIntelliJ IDEAが起動できるようにする
  • intellij.plugins 同様、値については gradle.properties へ設定

とします。

 
なお、 runIde はドキュメントによると intellij と同階層で定義してあったのでその通りにしたところ

[FUNCTION_EXPECTED] Expression 'runIde' cannot be invoked as a function. The function 'invoke()' is not found

というエラーが出て定義できませんでした。

そこで、stackoverflowの回答にある通り、 tasks の中に入れたところエラーが解消されました。
creating Android Studio plugin using IntelliJ runIde can not be invoked - Stack Overflow

 
ちなみに、 build.gradle.kts の書式は

  • Kotlin
    • ideDir.set(file(properties("ideDir")))
  • Groovy
    • ideDir = file(properties("ideDir"))

のどちらでも問題なく動作しました。

 
まとめるとこんな感じになります。

tasks {
    // ...
    runIde {
        // executable other IDE
        // キーに対する値が存在するときだけ、 ideDir を設定
        if (properties("ideDir").get().isNotEmpty()) {
            // Kotlin
            ideDir.set(file(properties("ideDir")))
            // Groovy
            // ideDir = file(properties("ideDir"))
        }
    }
}

 

gradle.properties の修正

続いて、build.gradle.kts で定義したキーに対応する値を gradle.properties へと記載します。

 

platformPlugins の設定

すでに platformPlugins = としてキーが存在しているため、値だけ設定します。

設定する値は、以下に掲載されているRubyプラグインのバージョンになります。
https://plugins.jetbrains.com/plugin/1293-ruby/versions

なお、RubyプラグインのバージョンはRubyMineのバージョンとは異なるので注意が必要です。

 
今回は、RubyMine 2023.2.6 で動作するバージョン 232.10203.2 とともに、以下のように指定します。

platformPlugins = org.jetbrains.plugins.ruby:232.10203.2

 

ideDirの設定

こちらは、RubyMineをインストールしたディレクトリを指定します。

今回の場合、インストール済の RubyMine 2023.2.6 があるディレクトリを指定します。

 
なお、インストールしたディレクトリはバージョン表記ではなくビルド表記なので注意が必要です。

バージョン表記とビルド表記の比較は、以下のページにて確認できます。
https://www.jetbrains.com/ja-jp/ruby/download/other.html

今回使うバージョン 2023.2.6 に対するビルド表記は 232.10300.41 でした。

 
また、runIde.ideDir にて指定すべきディレクトリ表記ですが、macOSの場合は以下のページに記載があります。
https://plugins.jetbrains.com/docs/intellij/rubymine.html#configuring-plugin-projects-targeting-rubymine

一方、今回はWindows環境なので調べてみたところ、手元のJetBrains ToolboxによるRubyMine 2023.2.6 のインストール先は以下でした。
(<USER_NAMEch-N は環境により読み替えてください。)

C:\Users\<USER_NAME>\AppData\Local\JetBrains\Toolbox\apps\RubyMine\<ch-N>\232.10300.41

 
このパスをgradleでビルドするためには、バックスラッシュ \エスケープして設定します。

ideDir =  C:\\Users\\<USER_NAME>\\AppData\\Local\\JetBrains\\Toolbox\\apps\\RubyMine\\<ch-N>\\232.10300.41

 

plugin.xml の修正

最後に、 plugin.xml にてRubyプラグインが必要な旨を末尾に追記します。

<idea-plugin>
    <!-- ファイル末尾 -->
    <depends>com.intellij.modules.ruby</depends>
</idea-plugin>

 

動作確認

以上で準備ができたので、 Run Plugin にて別インスタンスIDEを起動します。

すると、HelloToolWindowプラグインのあるRubyMine 2023.2.6 が起動しました。

 
また、IDEのRuntime versionは、IDEに同梱されている 17.0.9+8-b1166.2 amd64 でした。

 

特定のJBRでRubyMineを起動する

続いて、IDEのRuntime versionを特定のバージョンにして、Run Plugin できるよう設定を変更します。

特定のRuntime versionで実行には、 runIde.jbrVersion を指定すると良さそうです。

 
そこで

  • build.gradle.kts
  • gradle.properties

の2ファイルを修正します。

 

build.gradle.kts に runIde.jbrVersion キーを追加

先ほど追加した runIde キーの末尾に、jbrVersionキーを追加し、値を gradle.properties から取得するようにします。

runIde {
    // 末尾に追加
    if (properties("ideDir").get().isNotEmpty()) {
        jbrVersion.set(properties("jbrVersion"))
    }
}

 

gradle.properties に jbrVersion キーと値を追加

こちらも末尾に追加します。

指定可能なJBRのバージョンは、READMEに記載されています。
https://github.com/JetBrains/JetBrainsRuntime/releases

 
今回は、 2023.2 系の JDK 17 ベースで起動したいことから、Latest JBR にある 17.0.10-b1000.48 のリンクをクリックします。

 
すると Realeses ページに飛ぶので、先頭の Release の次にある 17.0.10b1000.48 を使用します。

jbrVersion = 17.0.10b1000.48

 

動作確認

再度 Run Plugin してRubyMineを起動すると、JBRのバージョンが切り替わっていました。

 

起動するIDEの構成を IntelliJ IDEA Ultimate + 自作プラグイン + Rubyプラグインにする

最後に、IntelliJ IDEA Ultimate でも起動できるよう設定します。

 

gradle.properties の修正

起動するIDEをRubyMineからIntelliJ IDEA Ultimateへ切り替えるだけなので、 gradle.propertiesideDirIntelliJ IDEA Ultimate 2023.2.6 がインストールされているパスへと変更します。

ideDir = C:\\Users\\<UserName>\\AppData\\Local\\JetBrains\\Toolbox\\apps\\IDEA-U\\<ch-N>\\232.10300.40

 

動作確認

再度 Run Pliugin を実行すると、IntelliJ IDEA Ultimate 2023.2.6 が起動しました。

 
プラグインページを見ると、自作プラグインRubyプラグインがインストールされていることがわかります。

 

その他参考資料

JetBrains のビルド番号の情報

Build Number Ranges | IntelliJ Platform Plugin SDK

Gradle IntelliJ Pluginの情報

Gradle IntelliJ Plugin | IntelliJ Platform Plugin SDK

 

ソースコード

Githubにあげました。
https://github.com/thinkAmi-sandbox/hello_jetbrains_plugin

今回のプルリクはこちら。
https://github.com/thinkAmi-sandbox/hello_jetbrains_plugin/pull/11

 
なお、gradle.properties の中に、個人のローカルPCのパスを指定しているため、今回のプルリクから gradle.propertiesgradle.properties.example へと差し替えています。

その結果、 gradle.properties が無い影響でCIがエラーになっています

そこで、もし実際に動かす場合には、 gradle.properties.examplegradle.properties ヘリネームし、自分の環境に合わせた設定へと変更する必要があります。

 
(2024/03/19 追記)

この後、gradle.properties.example を使う代わりに、 local.properties ファイルを使うことにしました。詳細は以下の記事に記載しています。
IntelliJ Platform Pluginの開発にて、開発環境にある公開したくない情報を local.properties に定義してビルドする - メモ的な思考的な

(2024/03/19 追記 ここまで)

 
また、「RubyMineのライセンスがないとサンプルコードが動かせない」という事態を避けるため、 plugin.xml の定義はコメント化してあります。