我正在尝试设置一个使用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的太多/任何干扰?
答案 0 :(得分:1)
我认为您需要的是一个根项目 - sequence-graphs
- 包含两个子模块 - library
和cmd-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-线工具。
sbt-onejar是一个简单的构建工具插件,用于构建包含所有代码和依赖关系作为嵌套JAR的单个可执行JAR。
请注意,SBT Officially supported packages添加了一些额外的检查和打印输出,即 tgz 附带bin/sbt
脚本执行以下操作(以及其他内容):< / p>
echo "Loading $(dirname "$(realpath "$0")")/sbt-launch-lib.bash"
它不是SBT本身不可或缺的一部分,但脚本本身希望尽可能多地做,以便最终用户感到高兴。在您的情况下,您不一定满意,因此要么从脚本中删除该行,要么按照Manual Installation中所述的步骤操作。