Поиск…


Основная настройка

  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 чтобы увидеть доступные задачи.

  3. Запустите gradle create-dirs чтобы создать каталог src/scala, src/resources .

  4. Запустите gradle build для создания зависимостей проекта и загрузки.

Создайте свой собственный плагин Gradle Scala

Пройдя пример Basic Setup , вы можете повторить большую часть его в каждом проекте Scala Gradle. Пахнет шаблоном кода ...

Что делать, если вместо применения плагина Scala, предлагаемого Gradle, вы можете применить свой собственный плагин Scala, который будет отвечать за обработку всей вашей общей логики сборки, одновременно расширяя уже существующий плагин.

Этот пример будет преобразовывать предыдущую логику сборки в многоразовый плагин Gradle.

К счастью, в Gradle вы можете легко создавать пользовательские плагины с помощью Gradle API, как указано в документации . В качестве языка реализации вы можете использовать Scala самостоятельно или даже Java. Однако большинство примеров, которые вы можете найти в документах, написаны в Groovy. Если вам нужно больше образцов кода или вы хотите понять, что находится за плагином Scala, например, вы можете проверить рельеф github gradle.

Написание плагина

Требования

Пользовательский плагин добавит следующие функции при применении к проекту:

  • scalaVersion свойства scalaVersion , который будет иметь два переопределяемых свойства по умолчанию
    • major = "2.12"
    • minor = "0"
  • функция withScalaVersion , которая применяется к имени зависимостей, добавит основную версию scala для обеспечения совместимости с двоичными файлами (оператор sbt %% может позвонить на звонок, в противном случае перейдите сюда, прежде чем продолжить)
  • задание createDirs для создания необходимого дерева каталогов, как и в предыдущем примере
Руководство по внедрению
  1. создайте новый проект градиента и добавьте следующее для build.gradle
apply plugin: 'scala'
apply plugin: 'maven'

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
    compile gradleApi()
    compile "org.scala-lang:scala-library:2.12.0"
}

Примечания :

  • реализация плагина написана в Scala, поэтому нам нужен плагин Scala Gradle Scala
  • для использования плагина из других проектов используется плагин Gradle Maven; это добавляет задачу install используемую для сохранения контейнера проекта в локальный репозиторий Maven
  • compile gradleApi() добавляет gradle-api-<gradle_version>.jar в 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")
    }
}

Примечания :

  • чтобы реализовать плагин, просто расширьте свойство Plugin типа Project и переопределите метод apply
  • в рамках метода apply у вас есть доступ к экземпляру Project , к которому применяется плагин, и вы можете использовать его для добавления к нему логики сборки
  • этот плагин не делает ничего, кроме применения уже существующего плагина Gradle Scala
  1. добавить scalaVersion объекта scalaVersion

Во-первых, мы создаем класс ScalaVersion , который будет содержать два свойства версии

class ScalaVersion {
  var major: String = "2.12"
  var minor: String = "0"
}

Одной из замечательных особенностей плагинов Gradle является то, что вы всегда можете добавлять или переопределять определенные свойства. Плагин получает этот пользовательский ввод через ExtensionContainer прикрепленный к экземпляру Project gradle. Для получения дополнительной информации проверьте это .
Добавив следующее к методу 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. добавьте библиотеку 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 и добавить его в проект
    Реализовать задачу 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, заключается в добавлении дополнительных наборов источников в Java, как вы можете видеть в документах плагина .

Добавьте задачу 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
Вы можете проверить установку, перейдя в каталог локального репозитория, обычно находящийся в ~/.m2/repository

Как Gradle находит наш новый плагин?

Каждый плагин Gradle имеет id который используется в заявлении apply . Например, написав следующий файл сборки, он переводит на триггер для Gradle, чтобы найти и применить плагин с id scala .

apply plugin: 'scala'

Точно так же мы хотели бы применить наш новый плагин следующим образом,

apply plugin: "com.btesila.scala.plugin"

что наш плагин будет иметь идентификатор com.btesila.scala.plugin .

Чтобы установить этот идентификатор, добавьте следующий файл:
SRC / основные / ресурсы / META-INF / Gradle-плагин / 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. run gradle createDirs - теперь вы должны создать все исходные каталоги
  2. переопределите версию scala, добавив ее в файл сборки:
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