SBT从子项目运行主要方法

Kno*_*uch 4 scala sbt

我正在写一个包含scala宏的项目。这就是为什么我将项目组织为两个子项目,称为“ macroProj”和“ coreProj”的原因。“ coreProj”取决于“ macroProj”,还包含运行我的代码的主要方法。

我的要求是,当我sbt run从根项目中进行操作时,主要方法是从coreProj子项目中获取的。我搜索并找到了一个可以解决这个问题的线程

sbt:在子项目上运行任务

基于此,我的build.sbt看起来像

lazy val root = project.aggregate(coreProj,macroProj).dependsOn(coreProj,macroProj)

lazy val commonSettings = Seq(
    scalaVersion := "2.11.7",
    organization := "com.abhi"
)

lazy val coreProj = (project in file("core"))
    .dependsOn(macroProj)
    .settings(commonSettings : _*)
    .settings(
        mainClass in Compile := Some("demo.Usage")
    )

lazy val macroProj = (project in file("macro"))
    .settings(commonSettings : _*)
    .settings(libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value)

mainClass in Compile <<= (run in Compile in coreProj)
Run Code Online (Sandbox Code Playgroud)

但是当我sbt run从根目录开始的时候。我得到一个错误

/Users/abhishek.srivastava/MyProjects/sbt-macro/built.sbt:19: error: type mismatch;
 found   : sbt.InputKey[Unit]
 required: sbt.Def.Initialize[sbt.Task[Option[String]]]
mainClass in Compile <<= (run in Compile in coreProj)
                                         ^
[error] Type error in expression
Run Code Online (Sandbox Code Playgroud)

Mar*_*tin 5

在sbt中,mainClass是一项任务,它将向您的程序返回入口点(如果有)。

您想要做的就是in mainClass的值。mainClasscoreProj

您可以通过以下方式实现:

mainClass in Compile := (mainClass in Compile in coreProj).value
Run Code Online (Sandbox Code Playgroud)

这也可以通过

mainClass in Compile <<= mainClass in Compile in coreProj
Run Code Online (Sandbox Code Playgroud)

但是,首选语法是(...).value 从sbt 0.13.0开始