2013-09-12 2 views
3

Я пытаюсь написать фреймворк, чтобы сделать плагины компилятора Scala проще, что я делаю, это писать фреймворк поверх квазиколов Scala. Поэтому мой проект зависит от макросов из макро-рая и библиотек scala-compiler и scala-reflect.Устранение зависимости макросов Scala и компилятора в SBT

Я написал сценарий SBT сборки, следуя инструкции, упомянутые здесь: https://github.com/scalamacros/sbt-example-paradise/blob/master/project/Build.scala

И использовал scalaVersion 2.11.0-ПАНОРАМА, 2.10.3-ПАНОРАМА, 2.10.3-RC1, 2.10.2 скомпилировать мой проект , но ни одна из них не работала. Вот мой SBT сценарий сборки:

import sbt._ 
import Keys._ 

object LombrelloBuildSettings { 
    val sversion = "2.10.3-SNAPSHOT" 
    val buildSettings = Defaults.defaultSettings ++ Seq(
    name := "lombrello", 
    organization := "ch.usi.inf.l3", 
    version := "0.1-SNAPSHOT", 
    scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature"), 
    scalaVersion := sversion, 
    scalaOrganization := "org.scala-lang.macro-paradise", 
    resolvers += Resolver.sonatypeRepo("snapshots"), 
    licenses := ("BSD 3-Clause", new java.net.URL("http://opensource.org/licenses/BSD-3-Clause")) :: Nil, 
    libraryDependencies ++= Seq("org.scala-lang.macro-paradise" % "scala-reflect" % sversion, 
     "org.scala-lang" % "scala-compiler" % sversion), 
    addCompilerPlugin("org.scala-lang.plugins" % "macro-paradise" % "2.0.0-SNAPSHOT" cross CrossVersion.full)) 
} 

object LombrelloBuild extends Build { 
    import LombrelloBuildSettings._ 

    lazy val root: Project = Project(
    "root", 
    file("."), 
    settings = buildSettings ++ Seq(
     run <<= run in Compile in tests 
    ) 
) aggregate (main, tests) 

    lazy val main: Project = Project(
    "main", 
    file("src/main"), 
    settings = buildSettings 

) 

lazy val tests: Project = Project(
    "tests", 
    file("src/test"), 
    settings = buildSettings ++ Seq(name := "tests")) dependsOn (main) 
} 

Использование scalaVersion 2.10-3-RC1, я получаю следующее сообщение об ошибке:

[warn] :::::::::::::::::::::::::::::::::::::::::::::: 
[warn] ::   UNRESOLVED DEPENDENCIES   :: 
[warn] :::::::::::::::::::::::::::::::::::::::::::::: 
[warn] :: org.scala-lang.macro-paradise#scala-library;2.10.3-RC1: not found 
[warn] :: org.scala-lang.macro-paradise#scala-reflect;2.10.3-RC1: not found 
[warn] :: org.scala-lang.macro-paradise#scala-compiler;2.10.3-RC1: not found 
[warn] :::::::::::::::::::::::::::::::::::::::::::::: 
sbt.ResolveException: unresolved dependency: org.scala-lang.macro-paradise#scala-library;2.10.3-RC1: not found 
unresolved dependency: org.scala-lang.macro-paradise#scala-reflect;2.10.3-RC1: not found 
unresolved dependency: org.scala-lang.macro-paradise#scala-compiler;2.10.3-RC1: not found 
    at sbt.IvyActions$.sbt$IvyActions$$resolve(IvyActions.scala:213) 
    at sbt.IvyActions$$anonfun$update$1.apply(IvyActions.scala:122) 

Использование, scalaVersion 2.11.0-ПАНОРАМА, я получил следующее сообщение об ошибке :

java.lang.NoClassDefFoundError: scala/tools/nsc/typechecker/TypersTracking$class 
    at org.scalalang.macroparadise.Plugin$$anon$1.<init>(Plugin.scala:20) 
    at org.scalalang.macroparadise.Plugin.<init>(Plugin.scala:20) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 

При использовании версии 2.10.3-SNAPSHOT я получил следующее:

[warn]  :::::::::::::::::::::::::::::::::::::::::::::: 
[warn]  ::   UNRESOLVED DEPENDENCIES   :: 
[warn]  :::::::::::::::::::::::::::::::::::::::::::::: 
[warn]  :: org.scala-lang.plugins#macro-paradise_2.10.3-SNAPSHOT;2.0.0-SNAPSHOT: not found 
[warn]  :::::::::::::::::::::::::::::::::::::::::::::: 
sbt.ResolveException: unresolved dependency: org.scala-lang.plugins#macro-paradise_2.10.3-SNAPSHOT;2.0.0-SNAPSHOT: not found 

И версия 2.10.2 не могла разрешить зависимости scala-library, scala-reflection и 2.10.2 вообще (например, 2.10.3-RC1)!

Мой вопрос в том, можно ли смешивать API-интерфейс компилятора и API-интерфейс Macro и заставить их работать под SBT, если да, что именно не так с моим скриптом сборки?

+2

Почему вы меняете scalaOrganization и добавляете макроса в райские банки в зависимости от библиотеки? Ссылка, которую вы предоставили, не делает этого. –

+0

Спасибо за ответ, но проблема, когда я следую ссылке Я получаю эту ошибку в своем коде: lombrello/src/main/scala/ch/usi/inf/l3/lombrello/transform/dsl/TransformerPluginComponent.scala: 13: объект Macro не является членом пакета scala.reflect.macros [error] import scala.reflect.macros.Macro –

+0

Еще раз спасибо, я наконец-то получил работу! Я в основном (вместо черты Macro bundle) импортировал файл scala.reflect.runtime.universe._, и все сработало! –

ответ

0

Похоже, что я использовал некоторые неправильные настройки в моей конфигурации SBT. Мне не нужно было менять scalaOrganization, не нужно было добавлять макро-рай в зависимости от моей библиотеки. поэтому настройки должны стать такими, как:

val sversion = "2.10.2" 
val buildSettings = Defaults.defaultSettings ++ Seq(
    name := "lombrello", 
    organization := "ch.usi.inf.l3", 
    version := "0.1-SNAPSHOT", 
    scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature"), 
    scalaVersion := sversion, 
    resolvers += Resolver.sonatypeRepo("snapshots"), 
    licenses := ("BSD 3-Clause", new java.net.URL("http://opensource.org/licenses/BSD-3-Clause")) :: Nil, 
    libraryDependencies ++= Seq("org.scala-lang" % "scala-reflect" % sversion, 
     "org.scala-lang" % "scala-compiler" % sversion), 
    addCompilerPlugin("org.scala-lang.plugins" % "macro-paradise" % "2.0.0-SNAPSHOT" cross CrossVersion.full) 
    ) 

Все кредиты идут на Eugene Burmako в этом comment.

Смежные вопросы