文档章节

sbt笔记八 scala构建定义

E
 Ellipse
发布于 2013/04/06 17:00
字数 1860
阅读 2034
收藏 2

.scala构建定义(sbt 0.13.0 Snapshot)

当前页面假定你已经阅读了Getting Started Guide的前面章节,尤其是.sbt build definition和more about settings。

sbt是递归的

build.sbt非常简单,它隐藏了sbt实际是如何工作的。sbt构建是用Scala代码定义的。这些代码自身需要建立。还有比sbt更好的方式吗?

project文件夹是你项目中的另一个子项目,它知道如何构建你的项目。子项目(理论上)可以可以做任何其他项目能做的事情。你的构建定义就是一个sbt项目。

如果你喜欢,你可以通过创建一个project/project/文件夹,来调整构建定义项目的构建定义。

这有一个例证。

hello/                  # your project's base directory

    Hello.scala         # a source file in your project (could be in
                        #   src/main/scala too)

    build.sbt           # build.sbt is part of the source code for the
                        #   build definition project inside project/

    project/            # base directory of the build definition project

        Build.scala     # a source file in the project/ project,
                        #   that is, a source file in the build definition

        build.sbt       # this is part of a build definition for a project
                        #   in project/project ; build definition's build
                        #   definition


        project/        # base directory of the build definition project
                        #   for the build definition

            Build.scala # source file in the project/project/ project

别担心!多数时候你并不需要全部。但理解原理是很有帮助的。

顺便说一下:任何时候,以.scala或.sbt结尾的文件都会被用上,把他们命名为build.sbt和Build.scala仅仅是惯例而已。这也意味着多个文件也是允许的。

构建定义项目中的.scala源文件

.sbt文件会合并入它们的兄弟项目文件夹。回顾一下项目布局:

hello/                  # your project's base directory

    build.sbt           # build.sbt is part of the source code for the
                        #   build definition project inside project/

    project/            # base directory of the build definition project

        Build.scala     # a source file in the project/ project,
                        #   that is, a source file in the build definition

build.sbt中的Scala表达式会编译并与Build.scala(或project/文件夹中的其他.scala文件)合并。

``.sbt`` files in the base directory for a project become part of the ``project`` build definition project also located in that base directory.(绕晕了)
项目根目录下的`.sbt`文件如果成为构建定义项目的一部分,也要放在相应的根目录下(是这个意思吗?)。

.sbt文件格式是将设置添加到构建定义项目的方便的速记法。

关联build.sbt到Build.scala

为了混合你的构建定义中的.sbt和.scala文件,你需要了解如何关联他们。

以下面两个文件举例。首先,如果你的项目在hello文件夹中,如下方式创建hello/project/Build.scala:
(译注:0.12.x略有不同,见http://www.scala-sbt.org/0.12.3/docs/Getting-Started/Full-Def.html#relating-build-sbt-to-build-scala)

import sbt._ import Keys._ object HelloBuild extends Build { val sampleKeyA = settingKey[String]("demo key A") val sampleKeyB = settingKey[String]("demo key B") val sampleKeyC = settingKey[String]("demo key C") val sampleKeyD = settingKey[String]("demo key D") override lazy val settings = super.settings ++ Seq(sampleKeyA := "A: in Build.settings in Build.scala", resolvers := Seq()) lazy val root = Project(id = "hello", base = file("."), settings = Project.defaultSettings ++ Seq(sampleKeyB := "B: in the root project settings in Build.scala")) }

现在,如下方式创建hello/build.sbt:

sampleKeyC in ThisBuild := "C: in build.sbt scoped to ThisBuild" sampleKeyD := "D: in build.sbt"

启动sbt交互命令窗口。输入inspect sampleKeyA,然后你讲看到(除了别的以外):

[info] Setting: java.lang.String = A: in Build.settings in Build.scala
[info] Provided by:
[info]  {file:/home/hp/checkout/hello/}/*:sampleKeyA

然后输入inspect sampleKeyC,你将看到:

[info] Setting: java.lang.String = C: in build.sbt scoped to ThisBuild
[info] Provided by:
[info]  {file:/home/hp/checkout/hello/}/*:sampleKeyC

需要注意“Provided by”显示了这两个值的相同范围。也就是,.sbt文件中的sampleKeyC in ThisBuild等价于将setting放在.scala文件的Build.settings列表中。sbt从这两个地方获取构建范围的设置来创建构建 定义。

现在,输入inspect sampleKeyB:

[info] Setting: java.lang.String = B: in the root project settings in Build.scala
[info] Provided by:
[info]  {file:/home/hp/checkout/hello/}hello/*:sampleKeyB

要注意sampleKeyB是项目范围的({file:/home/hp/checkout/hello/}hello)而不是整个构建({file:/home/hp/checkout/hello/})。

正如你可能已经猜到的,inspect sampleKeyB和sampleKeyD匹配。

[info] Setting: java.lang.String = D: in build.sbt
[info] Provided by:
[info]  {file:/home/hp/checkout/hello/}hello/*:sampleKeyD

sbt将.sbt文件的设置追加到Build.settings和Project.settings中的设置,这意味着.sbt中的设置有优先权。 尝试修改Build.scala中的sampleC或sampleD,它们依然是build.sbt中的值。build.sbt中的设置将胜过 Build.scala中的。

另一个你需要注意的:sampleKeyC和sampleKeyD在build.sbt内部有效。这是因为sbt将你的Build对象的内容导入到.sbt文件。在这个例子中build.sbt文件的import HelloBuild._是隐式完成的。

概括起来就是:

  • 在.scala文件中,你可以将设置添加到Build.settings,sbt可以找到它,而且它们自动是构建范围的。
  • 在.scala文件中,你可以将设置添加到Project.settings,sbt可以找到它,而且它们自动是项目范围的。
  • .scala文件中任何你写的Build对象,它们的内容将导入到.sbt文件并对它有效。
  • .sbt文件中的设置会被追加到.scala文件的设置。
  • .sbt文件中的任何设置都是项目范围的,除非你明确指定了另一个范围。

什么时候该使用.scala文件

在.scala文件中,你可以写任何Scala代码,包括值,对象和方法定义。

一种推荐的方式是,在.sbt文件中定义设置,只在实际需要一个值,对象或方法定义的时候使用.scala文件。

有一个构建定义,它是你主项目的嵌套项目。.sbt和.scala文件将一起被编译来创建单一的定义。

在单一构建中定义多个项目时.scala文件也是必需的。更多内容在Multi-Project Builds中讨论。

(在多项目构建中使用.sbt文件的一个缺点是,它们会在散布不同的文件夹中。因此,如果有子项目,很多人更喜欢把设置放在他们的.scala文件中。在你看完多项目构建是如何工作的之后将更加清晰。)

交互模式中的构建定义项目

你可以切换sbt交互命令行,使包含构建定义项目的project/作为当前项目。只需要这么做,输入reload plugins。

> reload plugins
[info] Set current project to default-a0e8e4 (in build file:/home/hp/checkout/hello/project/)
> show sources
[info] ArrayBuffer(/home/hp/checkout/hello/project/Build.scala)
> reload return
[info] Loading project definition from /home/hp/checkout/hello/project
[info] Set current project to hello (in build file:/home/hp/checkout/hello/)
> show sources
[info] ArrayBuffer(/home/hp/checkout/hello/hw.scala)
>

如上所示,您可以使用reload return离开构建定义项目并返回你的常规项目。

提示:所有都是不可变的

如果你认为build.sbt中的设置是被添加到Build和Project对象的settings域,那就错了。相反,Build和 Project,以及build.sbt中的设置,会被串联入另一个不可变的列表,然后作用于sbt。Build和Project对象只是构成完整构建定 义的一部分。

事实上,还有其他来源的设置。它们按这个顺序来追加:

  • .scala文件中来自Build.settings和Project.settings的设置。
  • 你的用户全局设置;例如,在~/.sbt/build.sbt中你可以定义设置来影响所有的项目。
  • 通过插件注入的设置,见后续使用插件章节。
  • 来自项目.sbt文件的设置。
  • 构建定义项目(也就是项目中的项目)拥有全局插件(~/.sbt/plugins)中添加的设置。使用插件章节有更详细的说明。

后面的设置会覆盖前面的。设置的完整列表构成了构建定义。

下一节

移到使用插件

© 著作权归作者所有

E
粉丝 46
博文 65
码字总数 41290
作品 0
大连
程序员
私信 提问
scala-Playframe框架 笔记

使用2.4x的Play框架.新建一个play项目提示 play.sbt.PlayExceptions$CompilationException: Compilation error[type Application is not a member of package controllers] at play.sbt.Pla......

testwork
2016/04/15
160
0
Scala下Play框架学习笔记(Actions,Controllers and Results)

Scala下Play框架的学习是一件辛苦的事情,因为该框架比较新,scala语言也较新,所以中文资料很少,经过同事推荐,去了如下英文网站看资料: https://www.playframework.com/documentation/2....

金明略
2016/12/22
0
0
SPARK学习之 --- eclipse / sbt / scala 配置

工作以及兴趣所致,开始了spark学习之旅,浏览网上大牛们的博客 文章,并且结合官网docs,刚开始云里雾里,现在也能雾里看到点花了。 学习spark,首先我们知道spark是由scala语言编写而成,至...

莫问viva
2016/01/12
2.6K
0
Scala学习笔记(2):开发环境的搭建

下载和安装Scala 前往http://www.scala-lang.org/downloads 下载Scala在各个平台的安装包,安装后即可在运行scala编译器和交互式命令行环境(interactive interpreter)。除此之外为了更加方便...

chengyao2
2013/04/29
9.5K
1
大数据学习笔记(六)-Spark环境配置

Spark版本:1.6.3 for hadoop2.6 下载地址:https://spark.apache.org/downloads.html Scala版本:2.11.8 下载地址:http://www.scala-lang.org/download/2.11.8.html Spark配置: spark-env配......

langyw98
2017/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

html2canvas 生成的图片变模糊解决方案

需求: 背景图片和二维码还有用户微信头像生成一张图片,可供用户下载。打开页面的时候就是一张图可以保存,html2canvas插件即可实现效果,效果是实现了,但是很郁闷,图片模糊了。。。。 为...

前端老手
13分钟前
3
0
语音翻译器在线翻译语音

对于英语不好的朋友来说,如果出国旅游,多多少少都会使用到翻译软件。通过在线翻译的方式,方便彼此的沟通交流。那么,有朋友就在问哪个英语翻译软件最准确?下面就来和大家一起分享下这个简...

401恶户
14分钟前
3
0
国内25家滤波器公司排名

国内做滤波器的企业都有哪些?哪些企业做滤波器是比较知名的?国内滤波器企业排名如何?以下是解优人才网小编给大家的分享,国内前25家做滤波器的企业详细信息。 1、武汉凡谷电子技术股份有限...

猎头悬赏平台
19分钟前
4
0
即时配送,不再只是巨头的战场

9月4日,第十届中国电子商务物流大会暨2019中国同城即时物流行业峰会于杭州召开。会上出现了蜂鸟即配、达达-京东到家、美团配送、点我达、闪送等一众即时配送行业中的知名企业的身影。 在艾媒...

喵二狸
19分钟前
3
0
Moto G 2014 LTE Root

[TOC] 下载moto专用mfastboot mfastboot-v2.zip 下载对应设备的twrp 我的是这个版本 Moto G 2014 LTE thea 刷入twrp # 1. 开启USE调试# 2. 允许OEM解锁# 3. 查看设备adb devices# 4. 进f...

yeahlife
23分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部