我认为您需要的是一个根项目 - 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-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 中描述的步骤进行操作。