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に潜り込んだり、戻ってきたりするコマンドがあります
あとは、session saveというコマンドもあります。sbtのコンソール上で動的にsetコマンドで設定を一時的に追加できるわけですが、それをbuild.sbtに追記するものです。
さて、ここまで説明したやつを全部組み合わせると便利なことに気づきました。何がしたいかというと
- 簡単によくつかうsbt pluginを追加、実行したい
- しかし、グローバル*1にpluginの定義しておくと、必要ないすべてのプロジェクトでもロードに毎回少しだけ時間かかるようになってしまうし、すでにそのプロジェクトにpluginが存在してる場合は追加したくない*2
- 「plugin追加かつ実行」まで一つのコマンドでやりたい
という需要です。具体的に、個人的によく使うpluginといえば、以下のものなどです
- https://github.com/gilt/sbt-dependency-graph-sugar *3
- https://github.com/mpeltonen/sbt-idea
- https://github.com/rtimush/sbt-updates
組み合わせるとは、つまり
- 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便利だ。
追記。的確なツッコミを受けたので貼っておきます
sbt-gpg 消したら動いた。互換性がないバージョンのライブラリに依存している sbt plugin 同士がぶつかるとこうなるのか。
@xuwei_k つい先程吉田さんのその記事を読んでいました。ひとつ疑問だったのは、最後に書いてある alias だと projects/plugins.sbt だかに IntelliJ などの設定が残りませんか?
2014-08-10 23:10:29 via TweetDeck to @xuwei_k
@kawachi 残りますね・・・(必要なければ手動でその後消してる、という残念運用)
@xuwei_k なるほど。。。
2014-08-10 23:11:59 via TweetDeck to @xuwei_k
@xuwei_k 入り組んでる感をひしひし感じます
2014-08-10 23:16:14 via TweetDeck to @xuwei_k
@kawachi session saveの正攻法使わずに「project/ の下に、衝突しないように今まで存在しないファイル名で .sbtを直接生成」「reload」「pluginのコマンド実行」「作ったファイル直接消す」をやってしまえば、できなくはないけれども・・・