Gradle Groovy Shellプラグインを使って依存ライブラリ込みのREPLを起動する #gadvent

このエントリは G*Advent Calendar(Groovy,Grails,Gradle,Spock...) Advent Calendar 2014 - Qiita の12/8担当分です。

Gradle Groovy Shellプラグインとは?

Groovyには"groovysh"(Groovy Shell)という機能があります。これはGroovyのインタラクティブシェルを起動するもので、いわゆるREPL相当の機能です。
それなりに便利な機能なのですが、残念ながらGroovyの標準ライブラリ以外を読み込むことができず、ライブラリを追加する場合には自力でクラスパスを通す必要があります。

Gradle Groovy Shellプラグインを利用すると、Gradleを利用して依存関係を解決した状態でgroovyshを起動することができます。

Gradle Groovy Shellプラグインの利用方法

Gradleのビルドスクリプトでgradle-groovysh-pluginを追加するだけです。
詳細はこちらを参照いただくとよいかと思います。

tkruse/gradle-groovysh-plugin · GitHub

V1.0.2での注意点

2014/12/8時点での最新バージョン(1.0.2)では、Gradle Groovy Shellプラグインのみを適用するとビルドエラーになります。
Javaプラグインのプロパティを参照していることが原因のようです。Javaプラグインもあわせて適用するようにしてください。

例) Twitter4Jを使ってみる

ここでは例として Twitter4J - A Java library for the Twitter API を使ってみましょう。
事前に https://apps.twitter.com/ でConsumer KeyやAccess Tokenを取得しておいてください。

適当なディレクトリで build.gradle 作成します。

apply plugin: 'com.github.tkruse.groovysh'
apply plugin: 'java'

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.tkruse.gradle:gradle-groovysh-plugin:1.0.2'
    }
}

repositories {
    jcenter()
}

dependencies {
    compile 'org.twitter4j:twitter4j-core:4.0+'
}

そして、次のコマンドでGroovy Shellを起動します。

$ gradle -q shell
This is a gradle Application Shell.
You can import your application classes and act on them.
Groovy Shell (2.3.6, JVM: 1.7.0_72)
Type ':help' or ':h' for help.
-------------------------------------------------------------------------------
groovy:000>

"groovy:000>"というプロンプトが表示されたら、おもむろにGroovyコードをタイプしていきましょう。(完全ではありませんが、TABキーによる補完もそれなりに効きます。)
なお、groovyshでは"def"で定義した変数は参照できないので、何もつけずに定義するようにしてください。

groovy:000> import twitter4j.*
===> twitter4j.*

groovy:000> import twitter4j.conf.*
===> twitter4j.*, twitter4j.conf.*

groovy:000> cb = new ConfigurationBuilder()
===> twitter4j.conf.ConfigurationBuilder@6c01e903

groovy:000> cb.setOAuthConsumerKey("<YOUR_CONSUMER_KEY>")
===> twitter4j.conf.ConfigurationBuilder@6c01e903

groovy:000> cb.setOAuthConsumerSecret("<YOUR_CONSUMER_SECRET>")
===> twitter4j.conf.ConfigurationBuilder@6c01e903

groovy:000> cb.setOAuthAccessToken("<YOUR_OAUTH_TOKEN>")
===> twitter4j.conf.ConfigurationBuilder@6c01e903

groovy:000> cb.setOAuthAccessTokenSecret("<YOUR_OAUTH_SECRET>")
===> twitter4j.conf.ConfigurationBuilder@5a8fddea

groovy:000> tf = new TwitterFactory(cb.build())
===> twitter4j.TwitterFactory@6bffa4b9

groovy:000> twitter = tf.getInstance()
===> TwitterImpl{INCLUDE_MY_RETWEET=PostParameter{name='include_my_retweet', value='true', file=null, fileBody=null}}

groovy:000> query = new Query("gradle")
===> Query{query='gradle', lang='null', locale='null', maxId=-1, count=-1, since='null', sinceId=-1, geocode='null', until='null', resultType='null', nextPageQuery='null'}

groovy:000> result = twitter.search(query)
[Mon Dec 08 02:35:38 JST 2014]Request: 
[Mon Dec 08 02:35:38 JST 2014]GET https://api.twitter.com/1.1/search/tweets.json?q=gradle&with_twitter_user_id=true&include_entities=true
・・・

groovy:000> result.tweets.each{ println "@${it.user.screenName}: ${it.text}" }
@csterwa: RT @danveloper: What if bootstrapping a cloud full of @NetflixOSS was as easy as typing "initCloud"? Now it is. https://t.co/44OVUgfKG4
@IndieGameDevBot: RT @lastpoke: Way to download Utility classes with Gradle http://t.co/suUwF0xSyj #Android #AndroidDev #lastpoke
・・・

Ctrl+Dで終了します。

2015/1/29追記

Groovy2.4でgroovyshのinterpreterModeが追加されました。
http://jira.codehaus.org/browse/GROOVY-6623

groovysh起動後に

:set interpreterMode true

を実行すれば、groovysh上でも普通に「def x=3」とかで変数定義できるようになりました。めでたい。

まとめ

簡単ですが、Gradle Groovy Shellプラグインについて紹介しました。
Groovy Shellプラグインは主にGradleのビルドスクリプト開発を支援するために使われることが多いようですが、それ専用ではなくもう少し汎用的に作られているということがわかります。他の言語処理系におけるREPLに比べるとやや機能不足な感は否めませんが、JavaのREPLが登場するまではこれで凌ぐというのもアリかと思います。

また、Groovyには言語機能としてGrape(@Grab)が用意されているのですが、Grapeはスクリプト実行以外の使い方ではうまく動かない場合もありますので、うまく使い分けるとよいのではないでしょうか。