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 tasks
을 확인합니다.src/scala, src/resources
디렉토리를 만들려면gradle create-dirs
를 실행하십시오.gradle build
를 실행하여 프로젝트를 빌드하고 종속성을 다운로드하십시오.
자신의 Gradle Scala 플러그인 만들기
Basic Setup 예제를 살펴본 후 Scala Gradle 프로젝트마다 대부분의 부분을 반복해서 볼 수 있습니다. 상용구 코드 냄새 ...
Gradle이 제공하는 스칼라 플러그인 을 적용하는 대신, 기존의 모든 플러그인을 처리하는 스칼라 플러그인을 적용 할 수 있으며 동시에 기존 플러그인을 확장 할 수 있습니다.
이 예제는 이전 빌드 로직을 재사용 가능한 Gradle 플러그인으로 변환 할 것입니다.
다행스럽게도 Gradle에서는 설명서에 설명 된대로 Gradle API를 사용하여 사용자 정의 플러그인을 쉽게 작성할 수 있습니다. 구현 언어로서 스칼라 자체 또는 Java를 사용할 수 있습니다. 그러나 문서 전체에서 찾을 수있는 대부분의 예제는 Groovy로 작성되었습니다. 더 많은 코드 샘플이 필요하거나 Scala 플러그인 뒤에 무엇이 들어 있는지 알고 싶다면, 예를 들어, gradle github repo를 확인할 수 있습니다.
플러그인 작성하기
요구 사항사용자 정의 플러그인은 프로젝트에 적용 할 때 다음 기능을 추가합니다.
- 2 개의
scalaVersion
가능한 디폴트 프롭퍼티를 가지는scalaVersion
프롭퍼티 객체- 메이저 = "2.12"
- 부 번호 = "0"
- 종속성 이름에 적용된
withScalaVersion
함수는 바이너리 호환성을 보장하기 위해 스칼라 주 버전을 추가합니다 (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
작업을 추가합니다 -
compile gradleApi()
하면gradle-api-<gradle_version>.jar
가 classpath에 추가됩니다.
- 플러그인 구현을위한 새로운 스칼라 클래스를 만든다.
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
클래스를 만듭니다.이 클래스는 두 가지 버전 속성을 보유합니다.
class ScalaVersion {
var major: String = "2.12"
var minor: String = "0"
}
Gradle 플러그인에 대한 멋진 점 중 하나는 특정 속성을 항상 추가하거나 무시할 수 있다는 것입니다. 플러그인은 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
라이브러리를 프로젝트 종속성에 추가합니다.
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 작업을 구현합니다.
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
태스크를 프로젝트에 추가하십시오.
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 플러그인에는 apply
문에 사용되는 id
가 apply
. 예를 들어, 다음을 빌드 파일에 쓰면 Gradle에 대한 트리거로 변환되어 ID scala
있는 플러그인을 찾아 적용합니다.
apply plugin: 'scala'
같은 방법으로 다음과 같은 방법으로 새로운 플러그인을 적용하고 싶습니다.
apply plugin: "com.btesila.scala.plugin"
플러그인이 com.btesila.scala.plugin
id를 갖게됨을 의미합니다.
이 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)
- 스칼라 버전과 바이너리 호환되는 종속성 라이브러리 추가
dependencies {
compile withScalaVersion("com.typesafe.scala-logging:scala-logging:3.5.0")
}
그게 다야! 이전의 상용구를 반복하지 않고도 모든 프로젝트에서이 플러그인을 사용할 수 있습니다.