Maven의 pom.xml을 SBT 코드로 변환하기
Scala 프로젝트에 대한 관리로 SBT 를 사용하기로 결정했지만 아직 별로 안써봐서 그다지 아는 건 없는 가운데 SBT에서 라이브러리를 관리하려고 보니 SBT에 디펜던시 라이브러리를 적는 문법이 꽤나 좀 헷갈렸습니다. 찾다 보니 많이 쓰는 Maven의 pom.xml의 dependencies부분을 SBT의 코드로 변환해 주는 컨버터 가 있었습니다. 당연히 제가 짠 건 아니고 Jason Zaugg 가 짠 코드입니다.
1object scala {
2 val version = "SCALA_VERSION$"
3}
4
5val xml = <dependencies>
6 </dependencies>
7
8val data: Seq[(String, String, String)] = (xml \ "dependency") map { d =>
9 val groupId = d \ "groupId" text
10 val artifactId = d \ "artifactId" text
11 val versionNum = d \ "version" text
12
13 (groupId, artifactId, versionNum)
14}
15
16val CrossBuildArtifact = """([\w-]+)_\$SCALA_VERSION\$""".r
17
18def dep(a: String, g: String, v: String, cross: Boolean) = {
19 val sep = if (cross) "%%" else "%"
20 val ident = a.split("-").map(_.capitalize).mkString
21 """val %s = "%s" %s "%s" %% "%s" """ format (ident, g, sep, a, v)
22}
23
24val m = data map {
25 case (g, CrossBuildArtifact(a), v) => dep(a, g, v, true)
26 case (g, a, v) => dep(a, g, v, false)
27} mkString("\n")
28println(m)
(코드는 어렵군요 ㅡㅡ;;) 위 코드에서 xml부분에 pom.xml의 dependencies부분을 붙혀넣고 터미널에서 스칼라스크립트로 실행해 주면 output으로 SBT의 코드를 아래처럼 만들어 줍니다.
1val LiftMapper = "net.liftweb" % "lift-mapper" % "2.2"
2val LogbackClassic = "ch.qos.logback" % "logback-classic" % "0.9.26"
3val H2 = "com.h2database" % "h2" % "1.2.138"
4val ServletApi = "javax.servlet" % "servlet-api" % "2.5"
5val Junit = "junit" % "junit" % "4.7"
6val Specs = "org.scala-tools.testing" % "specs" % "1.6.1"
7val Jetty = "org.mortbay.jetty" % "jetty" % "6.1.25"
8val ScalaCompiler = "org.scala-lang" % "scala-compiler" % "$SCALA_VERSION$"
기본적으로 xml을 파싱해서 스트링으로 변환만 해준 것이기 때문에 SBT에 맞추어서 변환해 주어야 할 부분은 변환해 주어야 할 것 같습니다. 예를 들면 각 라이브러리 마지막에 "compile->default"나 "test"같인 라이브러리가 사용처(?)를 지정해주는 부분이나 호환성을 위해서 %대신 %%를 추가하는 등의 작업은 따로 해주어야 합니다.
Comments