gpt4 book ai didi

scala - 如何在 SBT 的多项目构建中使用另一个子项目中的对象/类型?

转载 作者:行者123 更新时间:2023-12-02 04:56:42 25 4
gpt4 key购买 nike

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

/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

最佳答案

根项目中的以下 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(因此 ComponentA 因为 ComponentB 已经依赖于它)。

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

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()
}
}

有了这些文件,当您运行时,您应该得到以下输出:

[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

关于scala - 如何在 SBT 的多项目构建中使用另一个子项目中的对象/类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21183074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com