【问题标题】:SBT Build Setup for Library and Multiple Command Line Tools库和多个命令行工具的 SBT 构建设置
【发布时间】:2023-03-06 23:57:01
【问题描述】:

我正在尝试建立一个使用 SBT 构建的 Scala 项目,该项目将包含一个库和几个命令行工具,用于使用该库执行各种操作。库和工具将依赖于另一个 Scala 项目,我使用 sbt publish-local 安装到本地 Ivy 缓存中。

我以前从未使用过 SBT,所以对于如何设置它有点迷茫。我想在我的顶级项目目录中有几个 Linux 可执行文件或 shell 脚本,每个都执行 Scala 文件中定义的 main() 方法,并且所有这些都依赖于一个库。如何在 SBT 项目中进行这种设置?

我认为这必须工作的方式是作为具有多个项目的 SBT 配置,以及在适当的项目中执行 sbt run 的一堆包装器 shell 脚本。但是,当我在当前的单项目设置中运行 sbt run 时,除了程序的预期输出之外,我还得到了一堆 SBT 噪音:

Loading /pod/home/anovak/build/sbt/bin/sbt-launch-lib.bash
[info] Loading project definition from /pod/home/anovak/sequence-graphs/project
[info] Set current project to Sequence Graph API (in build file:/pod/home/anovak/sequence-graphs/)
[info] Running SequenceGraphs 
Sequence Graphs are great!
[success] Total time: 2 s, completed Jan 6, 2014 6:01:17 PM

我希望我的包装脚本能够运行我的命令行工具,而不会在屏幕上看到任何来自 SBT 的内容。我认为[info][success] 消息可以通过弄乱项目的日志级别设置来抑制,但这是否也会消除“正在加载...”行?如果没有,是否有其他方法可以“独立”运行 SBT 项目,而不会受到 SBT 的太多/任何干扰?

【问题讨论】:

标签: sbt command-line-interface


【解决方案1】:

我认为您需要的是一个根项目 - sequence-graphs - 带有两个子模块 - librarycmd-tools

project/build.properties 如下:

sbt.version=0.13.1
根项目的

build.sbt 如下:

lazy val root = project in file(".") aggregate (library, `cmd-tools`)

lazy val library = project

lazy val `cmd-tools` = project dependsOn library

只有这两个文件,您可以运行sbtprojects 来查看可用的项目。

[root]> projects
[info] In file:/Users/jacek/sandbox/so/sequence-graphs/
[info]     cmd-tools
[info]     library
[info]   * root

同时SBT会为子模块创建必要的子目录。

通过项目布局,您开始在cmd-tools 子模块中开发自己的命令行工具。

为了简单起见,我假设一个简单的App-扩展应用程序就足够了。

cmd-tools/Hello1.scala

object Hello1 extends App {
  println("Hello1")
}

cmd-tools/Hello2.scala

object Hello2 extends App {
  println("Hello2")
}

使用这两个Hellos,您可以在根项目的SBT shell 中运行cmd-tools/run

[root]> cmd-tools/run
[info] Compiling 2 Scala sources to /Users/jacek/sandbox/so/sequence-graphs/cmd-tools/target/scala-2.10/classes...

Multiple main classes detected, select one to run:

 [1] Hello2
 [2] Hello1

Enter number:

同样可以从命令行运行sbt cmd-tools/run:

jacek:~/sandbox/so/sequence-graphs
$ sbt cmd-tools/run
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
[info] Loading project definition from /Users/jacek/sandbox/so/sequence-graphs/project
[info] Set current project to root (in build file:/Users/jacek/sandbox/so/sequence-graphs/)

Multiple main classes detected, select one to run:

 [1] Hello1
 [2] Hello2

Enter number: 1

[info] Running Hello1
Hello1
[success] Total time: 4 s, completed Jan 9, 2014 9:44:39 PM

让我们重新开始,同时禁用infos 和[success]es 消息。

jacek:~/sandbox/so/sequence-graphs
$ sbt --error 'set showSuccess := false' cmd-tools/run

Multiple main classes detected, select one to run:

 [1] Hello1
 [2] Hello2

Enter number: 1

Hello1

还有runMain 命令运行第一个参数选择的主类,将剩余的参数传递给主方法。

使用该示例和其他示例,您可以拥有一个示例命令行脚本来执行 Hello1,如下所示:

sbt --error 'set showSuccess := false' 'cmd-tools/runMain Hello1'

如果您使用 the sbt-onejar plugin 可能会更简单,它可以使用 One-JAR™ 打包您的项目使用该插件,您在分发命令行工具后不必使用 SBT .

引用the plugin's documentation:

sbt-onejar 是一个简单的构建工具插件,用于构建单个可执行 JAR,其中包含所有代码和依赖项作为嵌套 JAR。

请注意,SBT 的 Officially supported packages 添加了一些额外的检查和打印输出,即 tgz 附带 bin/sbt 脚本,该脚本执行以下操作(除其他外):

echo "Loading $(dirname "$(realpath "$0")")/sbt-launch-lib.bash"

它不是 SBT 本身不可分割的一部分,而是脚本本身想要做的尽可能多的事情,让最终用户感到高兴。在您的情况下,您不一定很高兴,因此要么从脚本中删除该行,要么按照Manual Installation 中描述的步骤进行操作。

【讨论】:

  • sbt --error 'set showSuccess := false' 'cmd-tools/runMain Hello1' 负责 [Success] 和 [info] 行,但对 Loading /pod/home/anovak/build/sbt/bin/sbt-launch-lib.bash 不做任何事情,在任何调用 sbt 命令时都会首先打印(即使作为第一个sbt --help 的输出行)。 sbt-onejar 插件看起来很有希望,但这仍然让我运行 java -jar whatever.jar 命令来启动我的工具,并且(当我最初尝试使用 OneJar 时)吐出一堆关于不同版本的依赖项相互屏蔽的警告。跨度>
  • 你是如何安装 SBT 的?什么版本?我见过Loading...bash 消息,但猜测它来自shell 脚本本身而不是SBT。除了加载项目(不是.bash文件)之外,我在SBT的源代码中没有找到带有Loading字样的地方。
  • 我通过下载从scala-sbt.org/release/docs/Getting-Started/Setup.html 链接的官方 tgz 包,解压缩并将生成的 bin 目录添加到我的 PATH 来安装 SBT。
  • 添加了关于官方支持的 SBT 软件包的注释,这些软件包表现出您想要避免的行为。答案现在应该是完整的。提示,提示:如果确实如此,请接受它:)
猜你喜欢
  • 2021-11-23
  • 2012-11-24
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 2022-01-05
  • 2018-06-01
相关资源
最近更新 更多