욱'S 노트

SBT - Plugins 본문

Programming/sbt

SBT - Plugins

devsun 2017. 3. 3. 11:36

플러그인이란 무엇인가?

플러그인은 공통적으로 사용할 수 있는 확장된 빌드 정의이다. 새로운 세팅은 새로운 타스크를 만들수 있다. 예를 들어 플러그인을 추가함으로써 codeCoverage 타스크를 추가할 수 있다. 이를 통해 테스트 커버리지 리포트를 생성할 수 있다.

플러그인 정의하기

hello라는 프로젝트가 있다고 가정하고 플러그인을 추가하고 싶다면 먼저 hello/project/assembly.sbt라는 파일을 생성하고 해당 파일에 아래와 같이 기입한다. 또 한가지 방법으로는 hello/project/plugins.sbt에 아래와 같이 기입해도 된다.

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.4")

또 주의할 점은 모든 플러그인이 기본 리파지토리에 배포되어 있지 않을 수도 있다. 이럴 경우에는 아래와 같이 적절한 리파지토리를 추가해줘야 한다.

resolvers in Global ++= Seq(
  "Sbt plugins"                   at "https://dl.bintray.com/sbt/sbt-plugin-releases",
  "Maven Central Server"          at "http://repo1.maven.org/maven2",
  "JBoss" at "https://repository.jboss.org/"
)

플러그인 활성화 및 비활성화

플러그인을 빌드 정의에 추가함으로써 자동으로 활성화되며 추가적으로 수행할 작업은 없다.

sbt 0.13.5부터는 새로운 자동 플러그인 피처가 적용되었는데 많은 자동 플러그인들이 자동으로 세팅된다. 하지만 몇몇의 플러그인의 경우 명식적으로 활성화 시켜야 한다. 아래는 특정 플러그인을 명시적으로 활성화 시킨 예이다.

lazy val util = (project in file("util")).
  enablePlugins(FooPlugin, BarPlugin).
  settings(
    name := "hello-util"
  )

disablePlugins을 사용하여 명시적으로 비활성화도 가능하다.

lazy val util = (project in file("util")).
  enablePlugins(FooPlugin, BarPlugin).
  disablePlugins(plugins.IvyPlugin).
  settings(
    name := "hello-util"
  )

자동으로 활성화된 플러그인을 확인할려면 sbt plugins 커맨드로 확인할 수 있다.

$ sbt plugins
In file:/home/jsuereth/projects/sbt/test-ivy-issues/
        sbt.plugins.IvyPlugin: enabled in scala-sbt-org
        sbt.plugins.JvmPlugin: enabled in scala-sbt-org
        sbt.plugins.CorePlugin: enabled in scala-sbt-org
        sbt.plugins.JUnitXmlReportPlugin: enabled in scala-sbt-

sbt-assembly 플러그인을 활용해 패키징해보기

먼저 {프로젝트 루트}/project/assembly.sbt 파일을 생성한다. 그런 다음 아래와 같이 플러그인 추가 구문을 작성한다.

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.4")

{프로젝트 루트}에서 sbt plugins 라는 명령을 수행하여 Assembly Plugin이 제대로 추가되었는지 확인해본다.

$ sbt plugins
[info] Loading project definition from /Users/devsun/dev/projects/spark-test/project/project
[info] Loading project definition from /Users/devsun/dev/projects/spark-test/project
[info] Set current project to spark-test (in build file:/Users/devsun/dev/projects/spark-test/)
In file:/Users/devsun/dev/projects/spark-test/
        sbt.plugins.IvyPlugin: enabled in app
        sbt.plugins.JvmPlugin: enabled in app
        sbt.plugins.CorePlugin: enabled in app
        sbt.plugins.JUnitXmlReportPlugin: enabled in app
        sbt.plugins.Giter8TemplatePlugin: enabled in app
        sbtassembly.AssemblyPlugin: enabled in app

{프로젝트 루트}의 build.sbt로 가서 다음과 같이 작성한다. 여기서 mainClass는 executable jar에서 실행이

lazy val root = (project in file("."))
  .settings(
    name         := "hello",
    organization := "com.example",
    scalaVersion := "2.12.1",
    version      := "0.1.0-SNAPSHOT",
    mainClass in assembly := Some("HelloWorld")
  )

executable jar를 생성하기 위해 assembly 타스크를 수행한다.

$ sbt clean assembly
[info] Loading project definition from /Users/devsun/dev/projects/scala-test/project
[info] Set current project to hello (in build file:/Users/devsun/dev/projects/scala-test/)
[success] Total time: 1 s, completed 2017. 3. 3 오전 11:27:02
[info] Updating {file:/Users/devsun/dev/projects/scala-test/}root...
[info] Resolving jline#jline;2.14.1 ...
[info] Done updating.
[info] Compiling 10 Scala sources to /Users/devsun/dev/projects/scala-test/target/scala-2.12/classes...
[warn] Multiple main classes detected.  Run 'show discoveredMainClasses' to see the list
[info] Including: scala-library-2.12.1.jar
[info] Checking every *.class/*.jar file's SHA-1.
[info] Merging files...
[warn] Merging 'META-INF/MANIFEST.MF' with strategy 'discard'
[warn] Strategy 'discard' was applied to a file
[info] SHA-1: 6502a4b01a0a35d35baba2921b143a704ef77f9b
[info] Packaging /Users/devsun/dev/projects/scala-test/target/scala-2.12/hello-assembly-0.1.0-SNAPSHOT.jar ...
[info] Done packaging.
[success] Total time: 11 s, completed 2017. 3. 3 오전 11:27:12

{프로젝트 루트}/target/scala-2.12로 이동해서 패키징된 jar를 수행해보자.

$ java -jar hello-assembly-0.1.0-SNAPSHOT.jar
Hello world!

출처 : http://www.scala-sbt.org/0.13/docs/Using-Plugins.html

'Programming > sbt' 카테고리의 다른 글

SBT - 멀티 프로젝트  (0) 2017.02.28
SBT - 디펜던시 관리  (0) 2017.02.28
SBT - build definition  (0) 2017.02.27
SBT - 인텔리J와 시작하기  (0) 2017.02.22
Comments