sbt类似maven,非常简单,想必大家接触它都是使用其编译scala。本文仅以构建scala项目为例,java项目原理一致,不多敖述。
1.Hello World
直接从源码构建
一个sbt工程可以只包含一个源文件,尝试建立一个文件夹名为hello,内部生成源文件hw.scala。
object Hi {
def main(args: Array[String]) = println("Hi!")
}
接下来在hello文件夹内,执行命令sbt run即可编译执行scala源码。
</pre><pre name="code" class="plain">$ mkdir hello
$ cd hello
$ echo 'object Hi { def main(args: Array[String]) = println("Hi!") }' > hw.scala
$ sbt
...
> run
...
Hi!
在这个例子里,sbt工作方式十分简单,它会自动查找如下内容:
1.根目录下的源文件
2.src/main/scala中的源文件
3.src/test/scala中的源文件
4.src/main/resource/中的data文件
5.lib中的jar包
如果什么都不配置,sbt使用与编译自己相同版本的scala版本。
可以使用sbt (console)进入sbt命令行,其中可以执行诸如run,compile之类命令。
构建配置项
对于刚接触sbt的朋友最常去修改的配置文件,就是根目录下的build.sbt,后续会详细介绍。
设置sbt版本
修改project/build.properties
sbt.version=0.13.9
2.项目文件夹结构
根目录相关上文已经说了,包好配置文件和源码就可以直接跑了,当然,绝大多数开发者不把源码放在项目根目录下,太杂乱了,它应该这么放:
src/
main/
resources/
<files to include in main jar here>
scala/
<main Scala sources>
java/
<main Java sources>
test/
resources
<files to include in test jar here>
scala/
<test Scala sources>
java/
<test Java sources>
src中其它名字的文件会被直接无视。
根目录中有了build.sbt作文配置文件了,然而我们还可以在文件夹project中建立build.scala,编写一些构建依赖信息形成完整的构建定义。
build.sbt
project/
Build.scala
有些时候您会看到project中也有.sbt文件,它的作用将在后面说明。
构建结果会被放在target文件夹中,故如果你使用git作代码管理,请在.gitignore中加入target/
3.编译执行
在项目根目录下输入sbt进入sbt提示符,其中可以输入相关指令如compile。也可以以批处理的方式运行sbt,注意如果有参数的指令参数和命令一起要用引号括上,如:
$ sbt clean compile "testOnly TestA TestB"
还有个比较积累的东西,~可以让sbt连续执行某命令,如在sbt提示符输入~ compile,则进入动态编译,sbt观察源文件变化随时编译。
常用的共有指令如下:
clean | Deletes all generated files (in the target directory). |
compile | Compiles the main sources (in src/main/scala and src/main/java directories). |
test | Compiles and runs all tests. |
console | Starts the Scala interpreter with a classpath including the compiled sources and all dependencies. To return to sbt, type :quit, Ctrl+D (Unix), or Ctrl+Z (Windows). |
run <argument>* | Runs the main class for the project in the same virtual machine as sbt. |
package | Creates a jar file containing the files in src/main/resources and the classes compiled from src/main/scala andsrc/main/java. |
help <command> | Displays detailed help for the specified command. If no command is provided, displays brief descriptions of all commands. |
reload | Reloads the build definition (build.sbt, project/*.scala, project/*.sbt files). Needed if you change the build definition. |
4.sbt构建定义文件(Build definision)
有三种配置方式:裸sbt文件配置方式、复合项目sbt文件配置方式、scala文件配置方式。其中复合项目sbt文件配置方式最新出现,适合所有情况。
在build.sbt中,你可以建立一个放置在当前目录的项目的项目声明(project definition):
lazy val root = (project in file("."))
每一个项目都可以用一个永久的map来描述。构建定义不直接影响map。例如key是name,value是一个string对象内容为项目明。
然而,构建定义建立了一个巨大Setting[T]对象的队列,T是map alue的类型。一个Setting描述了一个对map的转换,例如添加一个新的key value对象或者补充一个已存在的值。对于永久数据结构和值,一些函数语言的转换返回新的map对象而不是替换它。
描述在当前目录的项目名称的Setting[String]可如下表示:
lazy val root = (project in file(".")).
settings(
name := "hello"
)
Setting[String]通过添加key name转换map,赋值为hello。转换后的map成为sbt新map。
在build.sbt中,定义了一个Project,它维护了一个Scala表示的称作settings的队列。例如:
lazy val commonSettings = Seq(
organization := "com.example",
version := "0.1.0",
scalaVersion := "2.11.4"
)
lazy val root = (project in file(".")).
settings(commonSettings: _*).
settings(
name := "hello"
)
每个Setting使用Scala定义,settings的描述彼此独立,仅被描述而不是声明。
build.sbt也可以使用vals,lazy vals,defs修饰。顶级别的object和class在build.sbt中不被允许。
Kyes有一个方法:=,返回一个Setting[T]。你可以使用类java的语法调用这个方法。Scala中直接使用:="hello"。