在SBT中解决Scala宏与编译器框架的依赖关系
我正在尝试编写一个框架,以使编写Scala编译器插件变得更容易,我正在做的是在Scala Quasikotes之上编写一个框架。所以我的项目依赖于macro paradise中的宏以及scala编译器和scala反射库 我按照这里提到的说明编写了一个SBT构建脚本: 并使用scalaVersion 2.11.0-SNAPSHOT、2.10.3-SNAPSHOT、2.10.3-RC1、2.10.2来编译我的项目,但它们都不起作用。以下是我的sbt构建脚本:在SBT中解决Scala宏与编译器框架的依赖关系,scala,sbt,scala-macros,scala-compiler,scala-quasiquotes,Scala,Sbt,Scala Macros,Scala Compiler,Scala Quasiquotes,我正在尝试编写一个框架,以使编写Scala编译器插件变得更容易,我正在做的是在Scala Quasikotes之上编写一个框架。所以我的项目依赖于macro paradise中的宏以及scala编译器和scala反射库 我按照这里提到的说明编写了一个SBT构建脚本: 并使用scalaVersion 2.11.0-SNAPSHOT、2.10.3-SNAPSHOT、2.10.3-RC1、2.10.2来编译我的项目,但它们都不起作用。以下是我的sbt构建脚本: import sbt._ import
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.11.0-SNAPSHOT,我得到了以下错误:
[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)
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.2根本无法解决scala库、scala reflect和2.10.2之间的依赖关系(如2.10.3-RC1)
我的问题是,是否可以混合使用编译器API和宏API并使它们在SBT下工作,如果可以,我的构建脚本到底出了什么问题?似乎我在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)
)
所有学分都归此。为什么要更改scalaOrganization并将宏paradise JAR添加到库依赖项中?您提供的链接没有这样做。谢谢您的回复,但问题是当我跟随链接时,我的代码中出现了以下错误:lombrello/src/main/scala/ch/usi/inf/l3/lombrello/transform/dsl/TransformerPluginComponent.scala:13:object Macro不是包scala.reflect.macros的成员[error]import scala.reflect.macros.macros再次感谢,我终于有办法了!我基本上(而不是宏包特性)导入了scala.reflect.runtime.universe.u,一切都正常!
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)
)