用于库和多个命令行工具的SBT构建设置

时间:2014-01-07 02:10:30

标签: sbt command-line-interface

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

我之前从未使用过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

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

1 个答案:

答案 0 :(得分: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

只有这两个文件,您可以运行sbt并执行projects以查看可用的项目。

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

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

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

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

<强> CMD-工具/ Hello1.scala

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

<强> CMD-工具/ Hello2.scala

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

使用这两个Hello,您可以在根项目中从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

让我们重新启动它,并禁用info[success]消息。

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命令运行第一个参数选择的主类,并将其余参数传递给main方法。

使用该示例和其他示例,您可以使用示例命令行脚本来执行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脚本执行以下操作(以及其他内容):< / p>

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

它不是SBT本身不可或缺的一部分,但脚本本身希望尽可能多地做,以便最终用户感到高兴。在您的情况下,您不一定满意,因此要么从脚本中删除该行,要么按照Manual Installation中所述的步骤操作。