Scala Language
Gradleを使って作業する
サーチ…
基本設定
次の内容の
SCALA_PROJECT/build.gradle
という名前のファイルを作成します。group 'scala_gradle' version '1.0-SNAPSHOT' apply plugin: 'scala' repositories { jcenter() mavenCentral() maven { url "https://repo.typesafe.com/typesafe/maven-releases" } } dependencies { compile group: 'org.scala-lang', name: 'scala-library', version: '2.10.6' } task "create-dirs" << { sourceSets*.scala.srcDirs*.each { it.mkdirs() } sourceSets*.resources.srcDirs*.each { it.mkdirs() } }
gradle tasks
して、利用可能なgradle tasks
を表示します。gradle create-dirs
を実行して、src/scala, src/resources
ディレクトリを作成します。gradle build
を実行して、プロジェクトをビルドし、依存関係をダウンロードします。
独自のGradle Scalaプラグインを作成する
Basic Setupの例を実行した後、Scala Gradleプロジェクトごとにそのほとんどを繰り返しているかもしれません。ボイラープレートコードのような匂い...
Gradleが提供するScalaプラグインを適用する代わりに、既存のプラグインを同時に拡張する、すべての共通のビルドロジックを処理する独自のScalaプラグインを適用することができます。
この例では、以前のビルドロジックを再利用可能なGradleプラグインに変換します。
幸いなことに、Gradleでは、 ドキュメントに記載されているように、Gradle APIの助けを借りてカスタムプラグインを簡単に書くことができます 。実装言語として、Scala自体またはJavaを使用することができます。しかし、ドキュメントを通して見つかるサンプルのほとんどはGroovyで書かれています。より多くのコードサンプルが必要な場合や、Scalaプラグインの背後にあるものを理解したい場合、たとえば、gradle github repoをチェックすることができます。
プラグインの作成
要件カスタムプラグインは、プロジェクトに適用すると次の機能を追加します。
-
scalaVersion
プロパティオブジェクト。オーバーライド可能なデフォルトプロパティが2つあります。- メジャー= "2.12"
- マイナー= "0"
-
withScalaVersion
依存関係の名前に適用される機能は、バイナリ互換性を確保するためにScalaのメジャーバージョンが追加されます(SBTの%%
オペレータがベルを鳴らすかもしれないが、そうでない場合は行くここに進む前に) - 前の例とまったく同じように、必要なディレクトリツリーを作成する
createDirs
タスク
- 新しいgradleプロジェクトを作成し、
build.gradle
以下を追加します
apply plugin: 'scala'
apply plugin: 'maven'
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
compile gradleApi()
compile "org.scala-lang:scala-library:2.12.0"
}
注 :
- プラグインの実装はScalaで書かれているので、Gradle Scala Pluginが必要です
- 他のプロジェクトのプラグインを使用するには、Gradle Maven Pluginを使用します。これにより、プロジェクトjarをMavenローカルリポジトリに保存
install
ために使用されるinstall
タスクが追加されます -
compile gradleApi()
をcompile gradleApi()
gradle-api-<gradle_version>.jar
がクラスパスに追加されます
- プラグインの実装用に新しいScalaクラスを作成する
package com.btesila.gradle.plugins import org.gradle.api.{Plugin, Project} class ScalaCustomPlugin extends Plugin[Project] { override def apply(project: Project): Unit = { project.getPlugins.apply("scala") } }
注 :
- プラグインを実装するには、単に
Project
型のPlugin
特性を拡張し、apply
メソッドをオーバーライドしてください - applyメソッド内では、プラグインが適用されている
Project
インスタンスへのアクセス権があり、それを使用してビルドロジックを追加することができます - このプラグインは、既存のGradle Scala Pluginを既に適用しています。
-
scalaVersion
オブジェクトプロパティを追加する
まず、 ScalaVersion
クラスを作成します。 ScalaVersion
クラスは、2つのバージョンプロパティ
class ScalaVersion {
var major: String = "2.12"
var minor: String = "0"
}
Gradleプラグインに関する優れた点の1つは、特定のプロパティを常に追加または上書きできるということです。プラグインは、この種のユーザー入力を、gradle Project
インスタンスに添付されたExtensionContainer
経由で受け取ります。詳細については、 これをチェックしてください。
apply
メソッドに以下を追加することによって、基本的にこれを実行します。
- プロジェクトに
scalaVersion
プロパティが定義されていない場合は、デフォルト値を追加します - さもなければ、
ScalaVersion
インスタンスとして既存のインスタンスをScalaVersion
、さらにそれを使用します
var scalaVersion = new ScalaVersion
if (!project.getExtensions.getExtraProperties.has("scalaVersion"))
project.getExtensions.getExtraProperties.set("scalaVersion", scalaVersion)
else
scalaVersion = project.getExtensions.getExtraProperties.get("scalaVersion").asInstanceOf[ScalaVersion]
これは、プラグインを適用するプロジェクトのビルドファイルに以下を書き込むのと同じです:
ext {
scalaVersion.major = "2.12"
scalaVersion.minor = "0"
}
-
scalaVersion
を使用して、scala-lang
ライブラリをプロジェクトの依存関係に追加しscalaVersion
project.getDependencies.add("compile", s"org.scala-lang:scala-library:${scalaVersion.major}.${scalaVersion.minor}")
これは、プラグインを適用するプロジェクトのビルドファイルに以下を書き込むのと同じです:
compile "org.scala-lang:scala-library:2.12.0"
-
withScalaVersion
関数を追加する
val withScalaVersion = (lib: String) => {
val libComp = lib.split(":")
libComp.update(1, s"${libComp(1)}_${scalaVersion.major}")
libComp.mkString(":")
}
project.getExtensions.getExtraProperties.set("withScalaVersion", withScalaVersion)
- 最後に、
createDirs
タスクを作成してプロジェクトに追加します
DefaultTask
を拡張してGradleタスクを実装しDefaultTask
。
class CreateDirs extends DefaultTask {
@TaskAction
def createDirs(): Unit = {
val sourceSetContainer = this.getProject.getConvention.getPlugin(classOf[JavaPluginConvention]).getSourceSets
sourceSetContainer forEach { sourceSet =>
sourceSet.getAllSource.getSrcDirs.forEach(file => if (!file.getName.contains("java")) file.mkdirs())
}
}
}
注 : SourceSetContainer
は、プロジェクトに存在するすべてのソースディレクトリに関する情報があります。 Gradle Scala Pluginの機能は、 プラグインのドキュメントにあるように、余分なソースセットをJavaに追加することです。
これをapply
メソッドに追加して、プロジェクトにcreateDir
タスクを追加しapply
。
project.getTasks.create("createDirs", classOf[CreateDirs])
結局、 ScalaCustomPlugin
クラスは次のようになります:
class ScalaCustomPlugin extends Plugin[Project] {
override def apply(project: Project): Unit = {
project.getPlugins.apply("scala")
var scalaVersion = new ScalaVersion
if (!project.getExtensions.getExtraProperties.has("scalaVersion"))
project.getExtensions.getExtraProperties.set("scalaVersion", scalaVersion)
else
scalaVersion = project.getExtensions.getExtraProperties.get("scalaVersion").asInstanceOf[ScalaVersion]
project.getDependencies.add("compile", s"org.scala-lang:scala-library:${scalaVersion.major}.${scalaVersion.minor}")
val withScalaVersion = (lib: String) => {
val libComp = lib.split(":")
libComp.update(1, s"${libComp(1)}_${scalaVersion.major}")
libComp.mkString(":")
}
project.getExtensions.getExtraProperties.set("withScalaVersion", withScalaVersion)
project.getTasks.create("createDirs", classOf[CreateDirs])
}
}
プラグインプロジェクトをローカルのMavenリポジトリにインストールする これは、 gradle install
実行gradle install
ことでとても簡単に実行されます
インストールを確認するには、ローカルのリポジトリディレクトリ(通常は~/.m2/repository
各Gradleプラグインには、 apply
ステートメントで使用されるid
ありapply
。例えば、以下をビルドファイルに書き込むことで、Gradleのトリガに変換され、id scala
プラグインを見つけて適用します。
apply plugin: 'scala'
同じように、新しいプラグインを次のように適用したいと思います。
apply plugin: "com.btesila.scala.plugin"
私たちのプラグインはcom.btesila.scala.plugin
idを持つことにcom.btesila.scala.plugin
ます。
このidを設定するには、次のファイルを追加します。
src / main / resources / META-INF / gradle-plugin / com.btesil.scala.plugin.properties
implementation-class=com.btesila.gradle.plugins.ScalaCustomPlugin
その後、再度gradle install
実行します。
プラグインの使用
- 新しい空のGradleプロジェクトを作成し、以下をビルドファイルに追加します
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
//modify this path to match the installed plugin project in your local repository
classpath 'com.btesila:working-with-gradle:1.0-SNAPSHOT'
}
}
repositories {
mavenLocal()
mavenCentral()
}
apply plugin: "com.btesila.scala.plugin"
-
gradle createDirs
実行gradle createDirs
- すべてのソースディレクトリが生成されるはずです - これをビルドファイルに追加してスカラのバージョンを上書きする:
ext {
scalaVersion.major = "2.11"
scalaVersion.minor = "8"
}
println(project.ext.scalaVersion.major)
println(project.ext.scalaVersion.minor)
- Scalaバージョンとバイナリ互換性のある依存関係ライブラリを追加する
dependencies {
compile withScalaVersion("com.typesafe.scala-logging:scala-logging:3.5.0")
}
それでおしまい!古いプラグインを繰り返すことなく、すべてのプロジェクトでこのプラグインを使用できるようになりました。