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")
}
Это оно! Теперь вы можете использовать этот плагин для всех своих проектов, не повторяя тот же старый шаблон.