用于库和多个命令行工具的SBT生成设置

用于库和多个命令行工具的SBT生成设置,sbt,command-line-interface,Sbt,Command Line Interface,我正在尝试建立一个Scala项目,使用SBT构建,它将由一个库和几个命令行工具组成,以使用该库完成各种事情。该库和工具将依赖于另一个Scala项目,我已使用sbt publish local将其安装到本地Ivy缓存中 我以前从未使用过SBT,所以我有点不知道如何设置它。我希望在我的顶级项目目录中有几个Linux可执行文件或shell脚本,每个都执行Scala文件中定义的main()方法,并且所有这些都依赖于单个库。我如何通过SBT项目获得这种设置 我认为这必须作为一个SBT配置来工作,它有多个项

我正在尝试建立一个Scala项目,使用SBT构建,它将由一个库和几个命令行工具组成,以使用该库完成各种事情。该库和工具将依赖于另一个Scala项目,我已使用
sbt publish local
将其安装到本地Ivy缓存中

我以前从未使用过SBT,所以我有点不知道如何设置它。我希望在我的顶级项目目录中有几个Linux可执行文件或shell脚本,每个都执行Scala文件中定义的
main()
方法,并且所有这些都依赖于单个库。我如何通过SBT项目获得这种设置

我认为这必须作为一个SBT配置来工作,它有多个项目,以及一堆在适当的项目中执行
SBT运行的包装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的太多/任何干扰?

我认为您需要的是一个根项目—
序列图
——带有两个子模块—
cmd工具

项目/构建属性将如下所示:

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

lazy val library = project

lazy val `cmd-tools` = project dependsOn library
sbt --error 'set showSuccess := false' 'cmd-tools/runMain Hello1'
根项目的build.sbt
如下所示:

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

lazy val library = project

lazy val `cmd-tools` = project dependsOn library
sbt --error 'set showSuccess := false' 'cmd-tools/runMain Hello1'
只有这两个文件,您才能运行
sbt
和执行
projects
以查看可用的项目

[root]> projects
[info] In file:/Users/jacek/sandbox/so/sequence-graphs/
[info]     cmd-tools
[info]     library
[info]   * root
同时,SBT将为子模块创建必要的子目录

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

为了使事情变得简单,我假设一个简单的
应用程序
扩展应用程序就足够了

cmd工具/Hello1.scala

object Hello1 extends App {
  println("Hello1")
}
object Hello2 extends App {
  println("Hello2")
}
cmd工具/Hello2.scala

object Hello1 extends App {
  println("Hello1")
}
object Hello2 extends App {
  println("Hello2")
}
使用这两个
Hello
s,您可以从根项目中的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
s和
[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
命令,它运行由第一个参数选择的主类,将剩余的参数传递给main方法

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

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

lazy val library = project

lazy val `cmd-tools` = project dependsOn library
sbt --error 'set showSuccess := false' 'cmd-tools/runMain Hello1'
当您使用一个JAR来打包您的项目时,它可能会更简单™ 使用该插件,在分发命令行工具后,您不必使用SBT

引述:

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

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


它不是SBT本身不可分割的一部分,而是脚本本身,它希望尽可能多地做一些事情,这样最终用户就会感到高兴。在您的情况下,您不一定感到高兴,因此可以从脚本中删除该行,或者按照中所述的步骤进行操作

您问题的第二部分已经在中得到了回答。
sbt--error'set showSuccess:=false''cmd tools/runMain Hello1'
处理[Success]和[info]行,但对加载/pod/home/anovak/build/sbt/bin/sbt启动库bash
没有任何作用,在调用sbt命令时,首先打印的是它(甚至是
sbt--help
的第一行输出)。
sbtonejar
插件看起来很有希望,但这仍然让我运行
java-jar whatever.jar
命令来启动我的工具,并且(当我最初尝试使用onejar时)发出了一系列关于不同版本的依赖项相互屏蔽的警告。你是如何安装sbt的?版本是什么?我看到了加载…bash的
消息,但我猜它来自shell脚本本身,而不是SBT。在SBT的源代码中,除了加载项目(不是
.bash
文件)之外,我找不到任何加载
word的地方。我通过下载链接的官方tgz包来安装SBT,并将其解压缩,并将生成的bin目录添加到我的路径中。添加了关于官方支持的SBT包的说明,这些包显示了您希望避免的行为。答案现在应该是完整的。提示,提示:如果确实是,请接受:)