以前、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() }
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
動きましたよ、と。