您的位置:首页 > 其它

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

2017-03-29 14:57 519 查看
 

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sbt