1. 更新報告

更新報告 

update 和相關任務會產生 sbt.librarymanagement.UpdateReport 型別的值。此資料結構提供有關已解析的設定、模組和構件的資訊。在最上層,UpdateReport 為每個已解析的設定提供 ConfigurationReport 型別的報告。ConfigurationReport 為給定設定解析的每個模組提供報告(ModuleReport 型別)。最後,ModuleReport 列出每個成功擷取的 Artifact 和它被擷取到的 File,以及無法下載的 Artifact。此遺失的 Artifact 清單對於 update 總是空的,如果它不是空的,則會失敗。但是,對於 updateClassifiersupdateSbtClassifers,它可能不是空的。

篩選報告並取得構件 

UpdateReport 的典型用途是擷取符合篩選條件的檔案清單。UpdateReport => RichUpdateReport 型別的轉換會隱式地為 UpdateReport 提供這些方法。篩選器由 DependencyFilterConfigurationFilterModuleFilterArtifactFilter 型別定義。使用這些篩選器型別,您可以依設定名稱、模組組織、名稱或修訂版本,以及構件名稱、型別、副檔名或分類器進行篩選。

相關方法(隱式地在 UpdateReport 上)為

def matching(f: DependencyFilter): Seq[File]

def select(configuration: ConfigurationFilter = ...,
  module: ModuleFilter = ...,
  artifact: ArtifactFilter = ...): Seq[File]

select 的任何引數都可以省略,在這種情況下,允許對應元件的所有值。例如,如果未指定 ConfigurationFilter,則會接受所有設定。個別篩選器型別將在下面討論。

篩選器基礎 

設定、模組和構件篩選器通常是透過將 NameFilter 套用到 ConfigurationModuleIDArtifact 的每個元件來建置的。基本的 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

ConfigurationFilter 

設定篩選器本質上會包裝 NameFilter,並由 configurationFilter 方法明確建構

def configurationFilter(name: NameFilter = ...): ConfigurationFilter

如果省略引數,則篩選器會比對所有設定。String => Boolean 型別的函數可隱式轉換為 ConfigurationFilter。與 ModuleFilterArtifactFilterNameFilter 一樣,&|- 方法可用於組合 ConfigurationFilter

import sbt._
val a: ConfigurationFilter = Set("compile", "test")
val b: ConfigurationFilter = (c: String) => c.startsWith("r")
val c: ConfigurationFilter = a | b

(此處的明確型別是可選的。)

ModuleFilter 

模組篩選器由三個 NameFilter 定義:一個用於組織,一個用於模組名稱,一個用於修訂版本。每個元件篩選器都必須比對,整個模組篩選器才能比對。模組篩選器由 moduleFilter 方法明確建構

def moduleFilter(organization: NameFilter = ..., name: NameFilter = ..., revision: NameFilter = ...): ModuleFilter

省略的引數不會影響比對。如果省略所有引數,則篩選器會比對所有 ModuleIDModuleID => Boolean 型別的函數可隱式轉換為 ModuleFilter。與 ConfigurationFilterArtifactFilterNameFilter 一樣,&|- 方法可用於組合 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

(此處的明確型別是可選的。)

ArtifactFilter 

構件篩選器由四個 NameFilter 定義:一個用於名稱,一個用於型別,一個用於副檔名,一個用於分類器。每個元件篩選器都必須比對,整個構件篩選器才能比對。構件篩選器由 artifactFilter 方法明確建構

def artifactFilter(name: NameFilter = ..., `type`: NameFilter = ...,
  extension: NameFilter = ..., classifier: NameFilter = ...): ArtifactFilter

Artifact => Boolean 型別的函數可隱式轉換為 ArtifactFilter。與 ConfigurationFilterModuleFilterNameFilter 一樣,&|- 方法可用於組合 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 組合方法的符號會加倍,以便將它們與更具體的設定、模組和構件篩選器的組合器區分開來。這些雙字元方法總是會傳回 DependencyFilter,而單字元方法會保留更具體的篩選器型別。例如

import sbt._

val df: DependencyFilter =
  configurationFilter(name = "compile" | "test") &&
  artifactFilter(`type` = "jar") ||
  moduleFilter(name = "dispatch-*")

在這裡,我們使用 &&|| 將個別元件篩選器組合到相依性篩選器中,然後可以將其提供給 UpdateReport.matches 方法。或者,可以使用 UpdateReport.select 方法,這相當於使用與 && 組合的引數呼叫 matches