sbt入门指南翻译(4)多项目构造/ 插件--渣翻译有错误望指教

 

Multi-project builds(多项目构造)

本章节是介绍多个项目定义在一个构建文件中。

 

Multi-project builds(多项目构造)

这对保持多个有关系的项目到一个构造里面,特别是如果他们依赖一个到另一个并且你倾向修改他们一起

 

每一个子项目在构造里面拥有自己的源数据目录,生成它自己的jar文件当你运行package,并且一般工作想任何其他项目

 

一个项目定义通过声明一个lazy val 类型 Project。例如

 

lazy val util = project

lazy val core = project

 

这个val的名字常常作为项目的ID和基本目录名称。这个ID在命令行关联的这个项目。基本目录可以修改冲默认使用里面的函数。譬如,下面是一个现实方式定义

 

lazy val util = project.in(file("util"))

lazy val core = project infile("core")

 

Common settings(公共设置)

提出多个项目里面的公共设置,创建一个队列叫commonSettings 并且在每一个项目里面setting调用。注意 _* 是需要传递给一个可变长度的方法

 

lazy val commonSettings =Seq(

organization := "com.example",

version := "0.1.0",

scalaVersion := "2.11.8"

)

lazy val core = (projectinfile("core")).

settings(commonSettings:_*).

settings(

// other settings

)

lazy val util = (projectinfile("util")).

settings(commonSettings:_*).

settings(

// other settings

)

现在我们可以修改 version在一个地方,他会被引用到所有子项目,当你重新加载项目的时候

 

Dependencies(依赖)

在build里面的项目可以和另外的项目完全对立。但是通常他们会引用一些,这里有两种类型依赖:aggregate和 classpath.

 

Aggregation(聚合)

Aggregation 意味着执行任务在总项目上可以执行聚合项目,例如

 

lazy val root = (projectinfile(".")).

aggregate(util, core)

 

lazy val util = project

lazy val core = project

 

在上面的例子,root项目聚合util和core。启动 sbt通过两个子项目在一个例子中,并且尝试编译。你应该看到所有三个项目编译

 

In the project doing the aggregating(在项目执行聚合)root项目就是这种情况,你可以控制聚合的前任务。譬如 避免聚合更新任务:

 

lazy val root = (projectinfile(".")).

aggregate(util, core).

settings(

aggregate in update := false

)

aggregate in update 就是aggregate关键字在update任务的范围里面

 

Classpath dependencies(类路径依赖)

一个项目可能基于其他项目的代码。这个通过添加dependsOn方法调用是可行的。例如,如果code需要util和它的类路径,你可以项目设置

 

lazy val core = project.dependsOn(util)

 

现在 在core里面的代码可以使用util的类。这样创建了一个项目编译时的顺序。Util必须先更新编译在core之前

 

可以依赖多个项目,对dependsOn,使用多个参数。如dependsOn(bar, baz).,

 

Per-configuration classpath dependencies(前置配置类路径依赖)

foo dependsOn(bar) 意味在foo的compile配置依赖于在bar的compile配置。你可以显示写成这样

 

dependsOn(bar % "compile->compile").

 

这个 >"compile->compile"意味着 依赖 所以“test->compile” 意味在foo的test配置依赖在bar的compile配置

 

可以省略 ->config 隐含 ->compile所以dependsOn(bar% "test") 意味着 foo的test配置依赖bar的compile配置

 

这是一个有用的声明"test->test",就是test依赖test。这就允许你把在bar/src/test/scala的实用代码可以在foo/src/test/scala使用。你也可以定义多个配置,譬如

dependsOn(bar %"test->test;compile->compile").

 

Default root project(定义根项目)

如果一个项目没有在build定义根目录,sbt会创建一个默认一个在build里所有的其他项目都聚合这里

 

因为项目hello-foo是使用base = file("foo"),定义的,它就包含在子目录foo。它的源数据在foo之下,像foo/Foo.scala或者 foo/src/main/scala 。这个通常是sbt目录结构适用于foo下除了构造文件外。

 

任何在foo的.sbt文件,譬如:foo/build.sbt,将会合并建立一个整个构造,但是范围到hello-foo项目。

 

如果你整个项目在hello,尝试定义不同版本(version :="0.6"in hello/build.sbt, hello/foo/build.sbt, and hello/bar/build.sbt。现在showversion 在sbt的交互模式下。你可以获取一些信息如下:

> show version

[info] hello-foo/*:version

[info] 0.7

[info] hello-bar/*:version

[info] 0.9

[info] hello/*:version

[info] 0.5

可以看到各自的sbt文件打印出不同版本号。记住范围关键字的语法。每一个version的范围是在项目里面的,基于本地的build.sbt。但是所有三个build.sbt都是同一个构造定义的一部分

 

Each project’s settings can go in .sbt files inthe base directory of that project,

.scala文件也可以想上面一样,列出项目和基本路径清单,There is no need to putsettings in the .scala file.

 

Navigating projects interactively

在sbt交互模式下,输入projects可以获取你项目清单并且可以project<projectname>选择一个当前项目。当你执行任务如compile,他是执行在当前项目上。所以你不需要编译root项目,你可以只编译一个子项目

 

你也可以在其他项目里面运行一个其他项目任务显示指明项目ID,例如 subProjectID/compile.

 

 

Common code(公共代码)

在.sbt文件里面定义的在其他.sbt是不可见的。为了共享.sbt文件代码。可以定义一个或者多个scala文件在project/目录下

 

 

Using plugins(使用插件)

What is a plugin?(什么是插件)

一个插件是继承构造定义,大多数一般情况是通过添加新的设置。这新的设置可以是一个新的任务。例如,一个插件可以添加一个codeCoverage任务 可以生成一个测试覆盖的报表

 

 

Declaring a plugin(声明一个插件)

如果你的项目在 hello的目录下,并且你添加sbt-site 插件到构造定义。创建hello/project/site.sbt并且声明一个插件依赖传入的lvy插件模型ID到addSbtPlugin:

addSbtPlugin("com.typesafe.sbt"% "sbt-site" % "0.7.0")

 

如果你添加sbt-assembly,创建create hello/project/assembly.sbt,文件定义如下

addSbtPlugin("com.eed3si9n"% "sbt-assembly"% "0.11.2")

 

并不是所有的插件都是基于默认资源库 并且 插件文档可能知道你添加资源库里面可以找到这个插件:

resolvers += Resolver.sonatypeRepo("public")

 

插件通常都是提供设置可以添加到项目,使项目可以使用插件功能。下面将会描述

 

Enabling and disabling auto plugins(启动禁止自动插件)

一个插件可以声明它设置被自动添加到构造定义,这样你就不需要去做任何事情去添加它们

 

在sbt 0.13.5 ,这里有一个新的插件特性就是自动,安全启动插件,确保他们设置和依赖都在一个项目上。许多自动插件有他们自己的默认自动设置,尽管这样,一些需要显示启动。

 

如果你使用的自动插件需要显式启动,这样你就需要添加下面设置到你的build.sbt

 

lazy val util = (projectinfile("util")).

enablePlugins(FooPlugin, BarPlugin).

settings(

name := "hello-util"

)

 

enablePlugins方法允许项目显式等译一个插件它们乐意使用的。

 

项目也可以显示关闭插件通过掉哟哦那个disablePlugins 方法。譬如如果哦我们想从Util项目移除lvyPlugin设置。我们修改我们的build.sbt如下:

 

lazy val util = (projectinfile("util")).

enablePlugins(FooPlugin, BarPlugin).

disablePlugins(plugins.IvyPlugin).

settings(

name := "hello-util"

)

 

自动插件需要写明他们可以被显示调用。如果你好奇那些自动插件在一个给定的项目启动,你就执行一下plugins在sbt控制台。

 

譬如:

> plugins

In file:/home/jsuereth/projects/sbt/test-ivy-issues/

sbt.plugins.IvyPlugin:enabled in scala-sbt-org

sbt.plugins.JvmPlugin:enabled in scala-sbt-org

sbt.plugins.CorePlugin:enabled in scala-sbt-org

sbt.plugins.JUnitXmlReportPlugin:enabled in scala-sbt-org

这里,使用plugins打印出那些插件被默认启动。Sbt默认设置提供下面三个插件

 

1. CorePlugin: 对并行控制任务的提供核心

2. IvyPlugin:  对于 publish/resolve模型的提供机制

3. JvmPlugin: 对编译compile/test/run/package Java/Scala projects. 提供机制

 

此外,JUnitXmlReportPlugin提供一个额外支持普通的junit-xml

 

旧的非自动的插件常常需要被明细设置加入到sbt里面,所以多个项目构建可以有不同类型的项目。插件的文档可以指出怎样配置它,但是对于旧的插件代表性涉及添加对插件的基本设置和需要定制

 

譬如,对于 sbt-site 插件,创建一个 site.sbt 写入下面的内容:

site.settings

去为项目启动它

 

如果构造定义多个项目,替换成直接添加它到项目

 

// don't use the site plugin for the `util`project

lazy val util = (projectinfile("util"))

 

// enable the site plugin for the `core`project

lazy val core = (projectinfile("core")).

settings(site.settings: _*)

 

全局插件

 

对于所有你的项目只会安装一次插件通过声明他们在~/.sbt/0.13/plugins/.。~/.sbt/0.13/plugins/是一个sbt项目类路径导出到所有的sbt构建定义项目,简单来说,任何.sbt或者.scala文件 在

~/.sbt/0.13/plugins/ 行为就像他们对于所有项目里面在project/定义

 

你可以在 ~/.sbt/0.13/plugins/ 创建 build.sbt 并且添加addSbtPlugin()表达式这样你所有的项目都会添加这个插件。因为这样做增加依赖到机器环境,这个特性应该少用。

 

 

Available Plugins(可用的插件)

 

这里有一个可以插件的列表

一下尤其是流行插件如

• those for IDEs (支持IDE插件)

• those supporting web frameworks,(支持web框架的)such as xsbt-web-plugin.(譬如xsbt-web-plugin)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值