【问题标题】:How to use object/type from one subproject in another in multi-project build in SBT?如何在 SBT 中的多项目构建中使用另一个子项目中的对象/类型?
【发布时间】:2014-01-27 22:29:19
【问题描述】:

我有以下多项目文件夹结构:

/ComponentA/ComponentA.scala
/ComponentA/build.sbt
/ComponentB/ComponentB.scala
/ComponentB/build.sbt
/project/Build.scala
main.scala

在根对象main.scala 中应该发生以下情况:ComponentA 返回一个字符串消息,ComponentB 读入并打印出来。

这是文件的内容:

组件A

object ComponentA {
  def main(args: Array[String]) {
    var myMessage : String = "this message should be passed to ComponentB";
    println("Message to forward: %s \n\n\n ".format(myMessage))
    return myMessage;
  }
}

组件B

object ComponentB {
  def main(args: Array[String]) {
    println("\n\n\n Inside ComponentB! \n\n\n ")
    println("Message received: %s \n\n\n ".format(args(0)))
  }
}

Build.scala

import sbt._
import Keys._

object RootBuild extends Build {
  lazy val root = Project(id = "root", base = file("."))
    .dependsOn(ComponentA, ComponentB)

  lazy val ComponentA = Project(id = "ComponentA", base = file("ComponentA"))

  lazy val ComponentB = Project(id = "ComponentB", base = file("ComponentB"))
    .dependsOn(ComponentA)

}

ma​​in.scala

object ComponentB {
  def main(args: Array[String]) {

    println("\n\n\n Inside main! \n\n\n ")

    // THIS SHOULD HAPPEN:
    // ComponentB(ComponentA());

  }
}

这种项目结构可以实现吗?如果是这样,main.scala 的代码将如何?

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    根项目中的以下build.sbt 应该允许您创建该项目结构。

    lazy val ComponentA = project
    
    lazy val ComponentB = project dependsOn ComponentA
    
    lazy val root = project in file(".") dependsOn (ComponentA, ComponentB) aggregate (ComponentA, ComponentB)
    

    您必须修复组件对象中的一些问题才能编译,但项目的类路径应该没问题。

    但是,将根项目聚合为子模块是一种常见的方法,因此在您的情况下,root 不应该有 dependsOn 与另一个单独的项目 ComponentABdependsOn ComponentB (因此 ComponentAComponentB 已经依赖它了)。

    下面的代码应该非常小心,并且只是为了这个问题。

    ComponentA/ComponentA.scala

    object ComponentA {
      def apply(): String = {
        var myMessage = "this message should be passed to ComponentB"
        println(s"Message to forward: $myMessage\n\n\n")
        myMessage
      }
    }
    

    ComponentB/ComponentB.scala

    object ComponentB {
      def apply(msg: String) = {
        println("\n\n\n Inside ComponentB! \n\n\n ")
        println("Message received: $msg\n\n\n")
      }
    }
    

    Main.scala

    object MainObject {
      def main(args: Array[String]) {
        println("\n\n\n Inside main! \n\n\n ")
        //ComponentB(ComponentA())
        ComponentA()
      }
    }
    

    使用文件,当您执行run 时,您应该得到以下输出:

    [root]> run
    [info] Running ComponentB
    
    
    
     Inside main!
    
    
    
    Message to forward: this message should be passed to ComponentB
    
    
    
    [success] Total time: 0 s, completed Jan 20, 2014 9:59:32 PM
    

    【讨论】:

    • 为了测试你的建议,你会把什么作为 main.scala?
    • 没有那么多乐趣(因为代码远非优雅的 Scala 代码)。提示,提示:如果答案对您有用,请接受答案。
    猜你喜欢
    • 2017-12-27
    • 2017-04-07
    • 1970-01-01
    • 2016-01-03
    • 2018-04-10
    • 2012-07-24
    • 2021-05-28
    • 2022-01-23
    • 2015-08-11
    相关资源
    最近更新 更多