IntelliJ Pluginの作り方(要点のみ)と作った感想
はじめに
IntelliJ Pluginの作り方は個人のブログでまとまっていたりするのですが、
イベントリスナーについてまで書いているものが見当たらなかったので書いて残しておくページです。
作ったもの
作った動機としては、IntellijのMarketplaceに公開されているこれ系のプラグインが自分の環境だと何故か動かなかったからです。
動いてる人もいるけど、頑張って動かすよりも自分で作った方が速そうだったので作った、というのが動機です。
project rootに.env
が置いてあったら、それを実行構成に自動で組み込んで実行するというものです。(ホントこれだけの機能が欲しいだけ。)
以下のようなものがある状態で、Gradleのタブの中からタスクを実行すると、Environment Variablesに自動で設定されて実行します。
※実行構成を追加して保存した場合も同様に自動で設定します。
HOGE=hoge
FUGA=fuga
設定されるのはここです。
Javaのプロセスが持っている環境変数のフィールドに直接設定できれば実行構成に保存する必要もないんですけど、今どきはそれをやろうとするとUnSupportedOperationException
が放り投げられるようになっているので、できなかった次第です。
Pluginの作り方
Plugin Templateが用意されているので、初めて作る場合はこれから作るのが良いと思います。
1回作ると大体わかるので2回目からはIntelliJから始めても良いかもです。
これベースでリポジトリを作ると動くものがすぐに手に入りますが、READMEを読んでも正直どこが肝なのかがわからなくて少し困りはしました。
一番重要なファイルは、src/main/resources/META-INF/plugin.xml
です。
IntelliJ Pluginはイベントをフックしてやりたい処理に紐づける、というのが基本的な実装になるみたいです。
あとは今回は使わなかったですが、Gradle TabのようなGUIの提供も行えます。(Templateから作った直後は存在してます。不要なので消しました。)
以下のxmlは最初に書いた、公開したpluginのplugin.xmlです。
<idea-plugin>
<id>com.github.shogawa.intellijenvfileplugin</id>
<name>load-env-file</name>
<vendor>sh-ogawa</vendor>
<depends>com.intellij.modules.platform</depends>
<projectListeners>
<listener class="jp.kroyeeg.intellijenvfileplugin.run.RunConfigurationListener"
topic="com.intellij.execution.RunManagerListener"/>
</projectListeners>
<extensions defaultExtensionNs="com.intellij">
<postStartupActivity implementation="jp.kroyeeg.intellijenvfileplugin.activity.ProjectOpenedActivity"/>
</extensions>
</idea-plugin>
どんなイベントがあるかは以下を見るとわかります。
自分で実装するクラスに関しては、上記リンクに書いてあるListener/ImplementationがそれぞれのInterfaceになるので、これを実装すればOKです。
プラグインの公開方法
Templateから作っている場合、publishはJetbrainsのアカウントを持っていればトークンをMyProfileから発行してそれを環境変数のPUBLISH_TOKEN
にセットして以下を叩くだけです。
./gradlew publishPlugin
これだけなのですが、CHANGELOGが書かれているか?やバージョン関連が問題ないかなど、チェックが入るので初回通す時だけめんどいと思います。
実際にPublishされるとJetbrainsのレビューが入りますが、リジェクトされることはない気がしています。
(テストコードちゃんと書いてないけど通ったし・・・)
その他Pluginを作って思ったこと
今回は実行構成を変更するようなものを作ってはみたものの、◯◯構成用に処理を追加する、という方向にしかならなかったです。
似たようなことをしたくなかったので、基底インタフェースに近いものを処理するように書いてはみたものの、Gradleでは動くけど他では動かない感じになってました(ちょっと予想外だった)
ぱっと見の雰囲気はこれらに対応する必要がありそうでやめましたw
そんなことなかったら教えて欲しいです。
何が言いたいかというと、Intellij Pluginにおいては上手く書けば全部で使えるようになる、という考えは捨てとこうということですw
終わりに
IntelliJ Pluginの作り方の要点だけを書きました。
このページで重要な箇所は、src/main/resources/META-INF/plugin.xml
について書いてあるところのみです。
また何か必要に駆られたら、何か作ろうと思います。
Discussion