sbtrcでsbt pluginを追加できるようにしておくと便利なことに気づいた

sbtには、便利なのにあまり知られてない.sbtrcという仕組みがあります。


rcというのは、bashrcとかzshrcとかのあれです。

ホームディレクトリ/.sbtrc

に置いておくか、それぞれのプロジェクトのディレクトリのトップに置いておくと読み込まれます。
よく使うコマンドのalias設定しておけます。aliasの設定機能自体知ってる人少ないかも?
たとえば自分は、今まで以下のようにしてます

alias cd=project
alias ls=projects
alias c=compile
alias t=test
alias r=run
alias tc=test:compile
alias to=test-only
alias tq=test-quick

これ、aliasにしても、タブ補完が同じように効くのでとても便利です。
さて、これもまたあまり知ってる人少ないと思いますが、sbtのコンソール上で複数コマンド入力する場合は、セミコロンで区切ります。たとえば、明示的に(それぞれの時間表示させるために?) compile と test:compile をそれぞれやりたい場合には、

;compile;test:compile

と入力します。

さらに、これもあまり知ってる人少ないと思いますが、sbtのproject定義は再帰的であり
http://www.scala-sbt.org/0.13/tutorial/Full-Def.html

project/plugin.sbt の他にも、project/project/plugin.sbt や project/project/build.scala を置いて使えます(あまり使う機会ないですが)

そして、以前書きましたが、その再帰的なプロジェクト定義の下のshellに潜り込んだり、戻ってきたりするコマンドがあります

sbtで一つ下の階層のシェルに入るコマンド

あとは、session saveというコマンドもあります。sbtのコンソール上で動的にsetコマンドで設定を一時的に追加できるわけですが、それをbuild.sbtに追記するものです。



さて、ここまで説明したやつを全部組み合わせると便利なことに気づきました。何がしたいかというと

  • 簡単によくつかうsbt pluginを追加、実行したい
  • しかし、グローバル*1にpluginの定義しておくと、必要ないすべてのプロジェクトでもロードに毎回少しだけ時間かかるようになってしまうし、すでにそのプロジェクトにpluginが存在してる場合は追加したくない*2
  • 「plugin追加かつ実行」まで一つのコマンドでやりたい

という需要です。具体的に、個人的によく使うpluginといえば、以下のものなどです

組み合わせるとは、つまり

  • reload plugins で一つ下の階層に入り
  • set addSbtPlugin で plugin 追加し
  • session saveで追加したpluginをそのままproject/plugin.sbtなどに保存し
  • reload returnで元の階層に戻ってきて
  • そのpluginのコマンドを実行

まで全部をするaliasを、グローバルの.sbtrcに定義してみました。それの結果が以下

alias gen-idea-plugin=;reload plugins;set addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0");session save;reload return;gen-idea
alias dependencyUpdatesPlugin=;reload plugins;set addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.1.6");session save;reload return;dependencyUpdates
alias dependencySvgPlugin=;reload plugins;set addSbtPlugin("com.gilt" % "sbt-dependency-graph-sugar" % "0.7.4");session save;reload return;dependencySvgView

sbt便利だ。



追記。的確なツッコミを受けたので貼っておきます

*1: sbt0.13系なら、 ホームディレクトリ/.sbt/0.13/plugins/build.sbt

*2: 稀に依存ライブラリのコンフリクトの可能性もあるし

*3: これ、graphvizというツールがローカルにインストールされてないと動かないので注意