update
和相關任務會產生 sbt.librarymanagement.UpdateReport
型別的值。此資料結構提供有關已解析的設定、模組和構件的資訊。在最上層,UpdateReport
為每個已解析的設定提供 ConfigurationReport
型別的報告。ConfigurationReport
為給定設定解析的每個模組提供報告(ModuleReport
型別)。最後,ModuleReport
列出每個成功擷取的 Artifact
和它被擷取到的 File
,以及無法下載的 Artifact
。此遺失的 Artifact
清單對於 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
。