SBT详解

文章转载自http://beike.iteye.com/blog/1575296

SBT = (not so) Simple Build Tool,是scala的构建工具,与java的maven地位相同。其设计宗旨是让简单的项目可以简单的配置,而复杂的项目可以复杂的配置。。。

https://github.com/notyy/sbtTemplate 是我配置好的一个sbt项目,已经配置好了单元测试框架specs2,log引擎logback,slf4j,和eclipse项目生成插件sbteclipse,拿来改改就可以用,单元测试覆盖率工具由于版本未跟上sbt新版本因此暂时不能用,过一阵会更新上。建议读者先checkout这个项目再继续往下读,以便随时可以做做实验。

  1. sbt项目的目录规约
    和maven一样,sbt有约定了一个通用的目录结构,使用约定的结构会使后面的工作简单很多。
    base/  
              build.sbt              //构建配置文件
             /project                 //也是构建配置的一部分
                          /build.scala                         //高级配置,可选
             /src/
                    /main
                              /scala
                              /java
                             /resources
                   /test
                              /scala
                              /java
                             /resources
    base代表项目的根目录
    项目配置可以在build.sbt文件里定义,也可以在base/project/build.scala文件里定义,一般情况下build.sbt就已经足够,除非多工程项目或者需要很多特殊定义的项目
  2. 常用命令
    在我读完sbt的getting started文档之前,我也经常有疑问:为什么scala不沿用maven,而要搞出sbt这么个(not so simple) Simple Build Tool ?
    在读完文档,并实际操作后,我现在感觉确实是物有所值的。
    checkout 我的sbtTemple项目后,进入命令行,进入到项目根目录,输入sbt回车进入sbt交互模式
    sbt有哪些命令可用?输入help命令查询,即会列出一堆可用的命令,比如exit,reload等,不知道某个命令的作用?help 命令名,比如输入help exit显示exit命令的作用。 
    列出的命令里并没有compile,test等常用的命令?因为那些不是sbt的命令而是当前工程的task. 输入 tasks命令,就可以看见 compile,test,package等等任务的说明了。
    想查看项目的配置?用show命令,输入show name,看当前项目的名字,输入show libraryDependencies看当前项目依赖的库,libraryDependencies太长记不住?输入lib后按tab键! 交互窗口是有tab提示的!输入help show,你可以看到show命令的作用是显示配置的值,如果show之后跟的是任务,则执行该任务并显示任务执行的结果。 你可以试试show compile看什么结果,如果你不想执行compile,而是想看命令的说明,请用inspect命令,inspect命令比较复杂,执行后输出的结果也比较复杂,具体这个命令的作用是什么请help inspect, 不过得等理解了build definition的含义后才能看懂help说的是什么。。。
    常用的任务则有compile, test, run,package,doc等,请顾名思义或自行help之。另外这些任务常常还有些变种,比如package-doc,package-src等,用tasks命令查看任务的列表,必有一款适合您
    有一个强大的任务不得不特别拎出来说一下:console
    输入console回车,会在当前会话内启动一个REPL,不要告诉我你不知道REPL是scala解释器的意思。。。就是你在命令行下输入scala回车后进入的那个交互界面。
    强大的是,sbt会加载你的项目依赖的全部jar包和你自己的代码! 你可以在这个解释器里实验你的半成品。 我的模板工程里有一个sample/Account.scala文件,十几行很简单的代码,你可以看一下,然后在console窗口里玩弄Account类和Account伴生对象.  不过别忘了先import sample._
    因为依赖的jar包也都被加载了,所以对于那些你可能还不熟悉的第三方库,你有可以在console里玩个痛快!这功能很给力,谁用谁知道。
    顺便在提一下,sbt命令有3种执行模式:
    1、交互式,即上文所描述的
    2、批处理式,即在命令行下输入sbt 命令名来执行,比如sbt compile就会编译代码,而不进入交互模式
    3、连绵不绝式,在命令名前加上~号,即会进入连绵不绝模式,比如~compile,会编译当前代码,然后监听代码改变,每当你编辑了代码并保存后,sbt就会自动编译代码,~test也一样,当你修改代码后自动编译并运行单元测试。按回车键可退出此模式。
  3. build definition释义
    你前面应该试过show nameshow libraryDependencies了吧?show出来的结果就是来自你的build.sbt文件,也就是build definition了。打开build.sbt就可以看到name := "sbt11template"  还有其他的一堆xxx := xxxx,很显然的,这就是个key-value pair,  sbt就是读取配置文件并构建一个key-value的map. 但是在build.sbt里面并非key := value, 而是key := expression. 文件里的每一行其实是一句scala语句,不行你可以试试把
    name := "sbt11template" 改成
    name := {"sbt11template".toUpperCase} 
    然后reload,  再show name,你会看到变成大写的SBT11TEMPLATE
    :=是最常用的方法,其作用就是将key设置成expression的值,相同的key如果被多次赋值,则后面的值会覆盖掉前面的值。适用于简单类型的key,比如name,version等。
    其他的常用方法有
    +=,将值添加进现有值里,适用于集合类型的key,比如libraryDependencies
    ++=,将一个集合值加入当前集合里
    ~= ,。。这个牛X,你在~=后面写个函数,~=将key的当前值传给你的函数,然后将函数结果作为新值,比如你可以在name := xxx后面再来一句 
    name ~= { _. toUpperCase },一样是把name变成大写
    <<= 将另一个key的值赋给当前key,比如auther <<= name ,这个方法还有个高级用法,你可以组合多个其他key的值,赋给当前key,用文档里的例子
    name <<= (name, organization, version) { (n, o, v) => "project " + n + " from " + o + " version " + v }

    还有适用于集合类型的版本
    <+= 和 <++=
    这些语法的官方文档在此https://github.com/harrah/xsbt/wiki/Getting-Started-More-About-Settings

  4. 依赖管理
    对于不打算通过官方repository管理的第三方库,在项目目录下建个lib目录,把jar包扔进去就行了。
    希望sbt待为管理的则在build.sbt里用下面的语法加入
    libraryDependencies += groupID % artifactID % revision % configuration
    % configuration是可选的,表示某依赖库只在特定配置中需要,比如模板项目里的"org.specs2" %% "specs2" % "1.7.1" % "test" 是单元测试框架,只在测试时需要。
    如果你视力好,会看到其中有个 %%,而不是一个%,这表示要求sbt寻找用当前你配置的scala版本编译出来的jar包,这是因为scala不同版本编译出来的结果会不兼容(悲剧),希望以后scala社区会解决这不兼容的问题。。。
    对于依赖的java语言写的库的jar包,就没这问题了,比如libraryDependencies += "org.slf4j" % "slf4j-api" % "1.6.4" 就不需要%%了
    配置好依赖后,运行sbt update,sbt会自动到maven库和scala官方库里去找这些jar包并下载到你的用户目录的.ivy2目录里面,如果你不同的项目用了相同的库,则sbt下载一次就够了。
    如果你希望sbt从你自己配置的repository里下载,使用这个语法:
    resolvers += name at location

    比如
    resolvers += "Scala-Tools Maven2 Snapshots Repository" at "http://scala-tools.org/repo-snapshots"
    所有的一切都是通过key类配置的,key 的列表在http://harrah.github.com/xsbt/latest/sxr/Keys.scala.html  慢慢看吧。。。

  5. sbt插件
    现有的sbt插件的列表在https://github.com/harrah/xsbt/wiki/sbt-0.10-plugins-list   安装的方法各有不同,请自己查阅
    我的项目模板里已经配置了sbteclipse插件,运行sbt eclipse或在交互模式下输入eclipse回车即会生成相应的eclipse项目文件,然后你就可以在eclipse里用import  /  existing projects into workspace来导入了。
  6. 高级配置
    高级配置显然不是半熟的我能搞定的东西。。。

    全文结束,未在文中讲解的内容有scopes(github.com/harrah/xsbt/wiki/Getting-Started-Scopes), 插件的本质和开发(https://github.com/harrah/xsbt/wiki/Getting-Started-Using-Plugins), 多工程项目(https://github.com/harrah/xsbt/wiki/Getting-Started-Multi-Project), 自定义Setting和任务(https://github.com/harrah/xsbt/wiki/Getting-Started-Custom-Settings),有兴趣的请猛击链接,自行学习

时间: 2024-10-25 05:47:04

SBT详解的相关文章

二叉树的应用详解 - 数据结构

二叉树的应用详解 - 数据结构 概述: 平衡树——特点:所有结点左右子树深度差≤1 排序树——特点:所有结点“左小右大字典树——由字符串构成的二叉排序树判定树——特点:分支查找树(例如12个球如何只称3次便分出轻重)带权树——特点:路径带权值(例如长度) 最优树——是带权路径长度最短的树,又称 Huffman树,用途之一是通信中的压缩编码. 1. 二叉排序树(二叉查找树 Binary Search Tree): 1.1 二叉排序树: 或是一棵空树:或者是具有如下性质的非空二叉树: (1)若左子树

二叉查找树(binary search tree)详解

二叉查找树(Binary Search Tree),也称二叉排序树(binary sorted tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值 任意节点的左.右子树也分别为二叉查找树 没有键值相等的节点(no duplicate nodes) 本文地址:http://www.cnblogs.com/archimedes/p/binary-search-tree

线段树详解 (原理,实现与应用)

线段树详解 By 岩之痕 目录: 一:综述 二:原理 三:递归实现 四:非递归原理 五:非递归实现 六:线段树解题模型 七:扫描线 八:可持久化 (主席树) 九:练习题 一:综述 假设有编号从1到n的n个点,每个点都存了一些信息,用[L,R]表示下标从L到R的这些点. 线段树的用处就是,对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是O(log2(n)). 线段树的原理,就是,将[1,n]分解成若干特定的子区间(数量不超过4*n),然后,将每个区间[L,R]都分解为 少量特定的子区

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

转载:DenseNet算法详解

原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/article/details/53468483 本文这里仅当学习笔记使用,具体细节建议前往原文细度. 论文:Densely Connected Convolutional Networks 论文链接:https://arxiv.org/pdf/1608.06993.pdf 代码的github链接:h

MariaDB(MySQL)创建、删除、选择及数据类型使用详解

一.MariaDB简介(MySQL简介略过) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品.在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB. MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL A

HttpServletResponse和HttpServletRequest详解

HttpServletResponse,HttpServletRequest详解 1.相关的接口 HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletRequest接口可以获取由客户端传送的名称,也可以获取产生请求并且接收请求的服务器端主机名及IP地址,还可以获取客户端正在使用的通信协议等信息.下表是接口HttpServletRequest的常用方法. 说明:HttpServ

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

阅读目录: 1.环路执行对象模型.碎片化执行模型(假递归式调用) 2.N层对象执行模型(纵横向对比链式扩展方法) 3.LINQ查询表达式和链式查询方法其实都是空壳子 4.详细的对象结构图(对象的执行原理) 5.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 6.完整的自定义查询 1]. 环路执行对象模型.碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频