Scala Language
Работа с люлькой
Поиск…
Основная настройка
Создайте файл с именем
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 create-dirsчтобы создать каталогsrc/scala, src/resources.Запустите
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для создания необходимого дерева каталогов, как и в предыдущем примере
- создайте новый проект градиента и добавьте следующее для
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к классам
- создать новый класс 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
- добавить
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"
}
- добавьте библиотеку
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и добавить его в проект
Реализовать задачу 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 имеет 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 .
Использование плагина
- создайте новый пустой проект 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"
- run
gradle createDirs- теперь вы должны создать все исходные каталоги - переопределите версию scala, добавив ее в файл сборки:
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")
}
Это оно! Теперь вы можете использовать этот плагин для всех своих проектов, не повторяя тот же старый шаблон.