update
和相关任务生成类型为 sbt.UpdateReport 的值。此数据结构提供了有关已解析配置、模块和工件的信息。在顶层,UpdateReport
为每个已解析配置提供了类型为 ConfigurationReport
的报告。ConfigurationReport
为给定配置解析的每个模块提供报告(类型为 ModuleReport
)。最后,ModuleReport
列出了每个成功检索的 Artifact
及其检索到的 File
,以及无法下载的 Artifact
。此缺少的 Artifact
列表在 update
中始终为空,如果它不为空,update
将失败。但是,它可能在 updateClassifiers
和 updateSbtClassifers
中不为空。
UpdateReport
的典型用法是检索与过滤器匹配的文件列表。UpdateReport => RichUpdateReport
类型的转换隐式地为 UpdateReport
提供这些方法。过滤器由 DependencyFilter、ConfigurationFilter、ModuleFilter 和 ArtifactFilter 类型定义。使用这些过滤器类型,您可以按配置名称、模块组织、名称或修订版以及工件名称、类型、扩展名或分类器进行过滤。
相关方法(隐式在 UpdateReport
上)是
def matching(f: DependencyFilter): Seq[File]
def select(configuration: ConfigurationFilter = ...,
module: ModuleFilter = ...,
artifact: ArtifactFilter = ...): Seq[File]
select
的任何参数都可以省略,在这种情况下,所有值都允许用于相应的组件。例如,如果未指定 ConfigurationFilter
,则所有配置都将被接受。以下将讨论各个过滤器类型。
配置、模块和工件过滤器通常通过将 NameFilter
应用于 Configuration
、ModuleID
或 Artifact
的每个组件来构建。基本 NameFilter
隐式地从字符串构造,其中 *
被解释为通配符。
import sbt._
// each argument is of type NameFilter
val mf: ModuleFilter = moduleFilter(organization = "*sbt*",
name = "main" | "actions", revision = "1.*" - "1.0")
// unspecified arguments match everything by default
val mf: ModuleFilter = moduleFilter(organization = "net.databinder")
// specifying "*" is the same as omitting the argument
val af: ArtifactFilter = artifactFilter(name = "*", `type` = "source",
extension = "jar", classifier = "sources")
val cf: ConfigurationFilter = configurationFilter(name = "compile" | "test")
或者,这些过滤器,包括 NameFilter
,可以直接由适当的谓词(返回布尔值的单参数函数)定义。
import sbt._
// here the function value of type String => Boolean is implicitly converted to a NameFilter
val nf: NameFilter = (s: String) => s.startsWith("dispatch-")
// a Set[String] is a function String => Boolean
val acceptConfigs: Set[String] = Set("compile", "test")
// implicitly converted to a ConfigurationFilter
val cf: ConfigurationFilter = acceptConfigs
val mf: ModuleFilter = (m: ModuleID) => m.organization contains "sbt"
val af: ArtifactFilter = (a: Artifact) => a.classifier.isEmpty
配置过滤器本质上包装了一个 NameFilter
,并由 configurationFilter
方法显式构造
def configurationFilter(name: NameFilter = ...): ConfigurationFilter
如果省略参数,则过滤器将匹配所有配置。类型为 String => Boolean
的函数隐式地可转换为 ConfigurationFilter
。与 ModuleFilter
、ArtifactFilter
和 NameFilter
一样,&
、|
和 -
方法可用于组合 ConfigurationFilter
。
import sbt._
val a: ConfigurationFilter = Set("compile", "test")
val b: ConfigurationFilter = (c: String) => c.startsWith("r")
val c: ConfigurationFilter = a | b
(这里的显式类型是可选的。)
模块过滤器由三个 NameFilter
定义:一个用于组织,一个用于模块名称,一个用于修订版。每个组件过滤器都必须匹配才能匹配整个模块过滤器。模块过滤器由 moduleFilter
方法显式构造
def moduleFilter(organization: NameFilter = ..., name: NameFilter = ..., revision: NameFilter = ...): ModuleFilter
省略的参数不会对匹配做出贡献。如果所有参数都被省略,则过滤器将匹配所有 ModuleID
。类型为 ModuleID => Boolean
的函数隐式地可转换为 ModuleFilter
。与 ConfigurationFilter
、ArtifactFilter
和 NameFilter
一样,&
、|
和 -
方法可用于组合 ModuleFilter
import sbt._
val a: ModuleFilter = moduleFilter(name = "dispatch-twitter", revision = "0.7.8")
val b: ModuleFilter = moduleFilter(name = "dispatch-*")
val c: ModuleFilter = b - a
(这里的显式类型是可选的。)
工件过滤器由四个 NameFilter
定义:一个用于名称,一个用于类型,一个用于扩展名,一个用于分类器。每个组件过滤器都必须匹配才能匹配整个工件过滤器。工件过滤器由 artifactFilter
方法显式构造
def artifactFilter(name: NameFilter = ..., `type`: NameFilter = ...,
extension: NameFilter = ..., classifier: NameFilter = ...): ArtifactFilter
类型为 Artifact => Boolean
的函数隐式地可转换为 ArtifactFilter
。与 ConfigurationFilter
、ModuleFilter
和 NameFilter
一样,&
、|
和 -
方法可用于组合 ArtifactFilter
import sbt._
val a: ArtifactFilter = artifactFilter(classifier = "javadoc")
val b: ArtifactFilter = artifactFilter(`type` = "jar")
val c: ArtifactFilter = b - a
(这里的显式类型是可选的。)
DependencyFilter
通常通过使用 &&
、||
和 --
将其他 DependencyFilter
组合在一起进行构造。配置、模块和工件过滤器本身就是 DependencyFilter
,可以作为 DependencyFilter
直接使用,也可以构建 DependencyFilter
。请注意,DependencyFilter
组合方法的符号是加倍的,以将其与配置、模块和工件的更具体过滤器的组合器区分开来。这些双字符方法将始终返回 DependencyFilter
,而单字符方法则保留更具体的过滤器类型。例如
import sbt._
val df: DependencyFilter =
configurationFilter(name = "compile" | "test") &&
artifactFilter(`type` = "jar") ||
moduleFilter(name = "dispatch-*")
在这里,我们使用 &&
和 ||
将单个组件过滤器组合成依赖过滤器,然后可以将其提供给 UpdateReport.matches
方法。或者,可以使用 UpdateReport.select
方法,该方法等效于使用其参数与 &&
组合来调用 matches
。