CLOVER🍀

That was when it all began.

Gradle(2.1)とScala(2.11.2)と

以前、Gradleを使ってScalaプロジェクトを試したことがありましたが、fscがうまく動かなかったりして、なんだかんだで重いなーということで使っていませんでした。

が、このことをTwitterでツイートしていたら、今使っているという方にツッコミをいただいたので、久しぶりに試してみることにしました。

こちらを見ながら。

Chapter 25. The Scala Plugin
http://www.gradle.org/docs/current/userguide/scala_plugin.html

使用するScalaおよびGradleのバージョンの組み合わせは、このエントリを書いている時点の最新版、Scalaが2.11.2、Gradleが2.1となります。

はじめに

手始めに、最小設定はこんな感じですね。
build.gradle

apply plugin: 'scala'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.scala-lang:scala-library:2.11.2'
}

これで、スケープゴート的なソースを用意。
src/main/scala/HelloGradle.scala

object HelloGradle {
  def main(args: Array[String]): Unit =
    new Greeting().say()
}

src/main/scala/Greeting.scala

class Greeting {
  def say(): Unit =
    println("Hello Scala!!")
}

必要なライブラリのダウンロードは終わっているものとして、とりあえずビルド。

$ gradle build
:compileJava UP-TO-DATE
:compileScala
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:compileTestScala UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

Total time: 19.398 secs

動きましたね。…ええ、決して速くはありませんが。つか、絶対うちのPC遅い。

Daemonモードにしておくと、少しは改善されますけれど(1度clean実行済み)。

$ gradle --daemon build
:compileJava UP-TO-DATE
:compileScala
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:compileTestScala UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

Total time: 10.707 secs

何回か動かしてみましたが、所要時間にはだいぶムラがありました。

fscを試す

fscを有効にするには、build.gradleに以下を加えます。

compileScala {
    scalaCompileOptions.useCompileDaemon = true
}

とりあえず、1度Daemonを止めて試してみましょう。

$ gradle build
:compileJava UP-TO-DATE
:compileScala FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileScala'.
> Compilation failed because of an internal compiler error; see the error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 14.676 secs

…相変わらず動かないですね、この人。

当然ながら、Daemonモードにしても動きません。

スタックトレースを出してみると、fscがコケているようですがあまり深追いする気にもならず…。

Caused by: : Compilation failed because of an internal compiler error; see the error output for details.
	at scala.tools.ant.ScalaTask$class.buildError(ScalaMatchingTask.scala:27)
	at scala.tools.ant.ScalaMatchingTask.buildError(ScalaMatchingTask.scala:30)
	at scala.tools.ant.FastScalac.execute(FastScalac.scala:150)
	at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
	at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)

インクリメンタルコンパイル

というわけで、fscはとっとと諦めて、インクリメンタルコンパイルへ。

設定的には、以下になります。

tasks.withType(ScalaCompile) {
    scalaCompileOptions.useAnt = false
}

こちらは動作しました。いただいた情報では、Daemonモードではうまく動かないということでしたが、このくらいのソースなら大丈夫だったようで…。

でも、このくらいのソースだと、設定を入れた効果もわかりませんでしたけれど…。

どうなのかなぁ?

あと、普通に実行するくらいはやっておきましょうか。applicationプラグインを当てて

apply plugin: 'scala'
apply plugin:'application'

mainClassName = 'HelloGradle'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.scala-lang:scala-library:2.11.2'
}

実行!

$ gradle --daemon run
:compileJava UP-TO-DATE
:compileScala
:processResources UP-TO-DATE
:classes
:run
Hello Scala!!

BUILD SUCCESSFUL

Total time: 13.756 secs

動きましたよ、と。