如何在 Scala/SBT 项目中轻松使用 类?

How to easily play around with the classes in an Scala/SBT project?

我是 Scala/SBT 的新手,我无法理解如何尝试 类 和包的功能以了解它们的含义,感受一下为他们。例如,以 https://github.com/plokhotnyuk/rtree2d 为例。我想做的是(在项目的顶级文件夹中)

   # sbt
   > console
   > import com.github.plokhotnyuk.rtree2d.core._ 
     ...

等但这不会起作用,因为即使它在项目中也找不到导入。对于这个模糊的问题,我深表歉意,尽管我希望从我的挥手中可以清楚地看出我想做什么。另一种说法可能是,我正在寻找类似直观易用性的东西,我在 Python 中认为这是理所当然的——仅使用 bash 和解释器。作为最后的手段,我可​​以创建一个单独的项目并导入这个包并编写一个 Main 对象,但这对于我想做的事情来说似乎太迂回和麻烦了。我也希望尽可能避免使用 IDE,因为我从来没有真正控制过它们,因为它们在后台做各种事情,增加了大量的体积和复杂性。

rtree2d 利用了 sbt 的 multi-module 功能;一个常见的用途是将核心功能放在一个模块中,并在依赖于核心的模块中具有较少的核心方面(例如 higher-level API 或与其他项目的集成):所有这些模块都可以独立发布并且有自己的依赖。

这可以在 build.sbt 文件中看到:

// The main project -- LR
lazy val rtree2d = project.in(file("."))
  .aggregate(`rtree2d-coreJVM`, `rtree2d-coreJS`, `rtree2d-benchmark`)
  // details omitted --LR

// Defines the basic skeleton for the core JVM and JS projects --LR
lazy val `rtree2d-core` = crossProject(JVMPlatform, JSPlatform)
  // details omitted

// Turns the skeleton into the core JVM project --LR
lazy val `rtree2d-coreJVM` = `rtree2d-core`.jvm

// Turns the skeleton into the core JS project --LR
lazy val `rtree2d-coreJS` = `rtree2d-core`.js

lazy val `rtree2d-benchmark` = project

在 sbt 中,命令可以通过 module/command 限定在特定模块中,所以在交互式 sbt shell(来自 top-level)中,你可以做

> rtree2d-coreJVM/console

到运行 JVM 核心模块中的控制台。您也可以直接从顶层的 shell 运行 sbt 'rtree2d-coreJVM/console',尽管这可能需要注意 shell 引用等