サーチ…


基本設定

  1. 次の内容の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() }
    }
    
    
  2. gradle tasksして、利用可能なgradle tasksを表示します。

  3. gradle create-dirsを実行して、 src/scala, src/resourcesディレクトリを作成します。

  4. 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タスク
実施ガイドライン
  1. 新しい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がクラスパスに追加されます
  1. プラグインの実装用に新しい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を既に適用しています。
  1. 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"

}

  1. 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"
  1. 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)
  1. 最後に、 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は新しいプラグインをどのように見つけますか?

各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実行します。

プラグインの使用

  1. 新しい空の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"

  1. gradle createDirs実行gradle createDirs - すべてのソースディレクトリが生成されるはずです
  2. これをビルドファイルに追加してスカラのバージョンを上書きする:
ext {
    scalaVersion.major = "2.11"
    scalaVersion.minor = "8"

}
println(project.ext.scalaVersion.major)
println(project.ext.scalaVersion.minor)
  1. Scalaバージョンとバイナリ互換性のある依存関係ライブラリを追加する
dependencies {
    compile withScalaVersion("com.typesafe.scala-logging:scala-logging:3.5.0")
}

それでおしまい!古いプラグインを繰り返すことなく、すべてのプロジェクトでこのプラグインを使用できるようになりました。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow