수색…


기본 설정

  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. src/scala, src/resources 디렉토리를 만들려면 gradle create-dirs 를 실행하십시오.

  4. 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 작업
시행 지침
  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 작업을 추가합니다
  • compile gradleApi() 하면 gradle-api-<gradle_version>.jar 가 classpath에 추가됩니다.
  1. 플러그인 구현을위한 새로운 스칼라 클래스를 만든다.
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 클래스를 만듭니다.이 클래스는 두 가지 버전 속성을 보유합니다.

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"

}

  1. 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"
  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 작업을 구현합니다.
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은 새로운 플러그인을 어떻게 찾습니까?

각 Gradle 플러그인에는 apply 문에 사용되는 idapply . 예를 들어, 다음을 빌드 파일에 쓰면 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 실행하십시오.

플러그인 사용

  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. 스칼라 버전과 바이너리 호환되는 종속성 라이브러리 추가
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