1. 類別路徑、來源程式碼與資源

類別路徑、來源程式碼與資源 

此頁面討論 sbt 如何為不同的動作(例如 compileruntest)建構類別路徑,以及如何覆寫或擴增這些類別路徑。

基本概念 

在 sbt 中,類別路徑包含 Scala 函式庫以及(在宣告為相依性時)Scala 編譯器。與類別路徑相關的設定與任務通常會提供 Classpath 型別的值。這是 Seq[Attributed[File]] 的別名。Attributed 是一種型別,它將異質對應與每個類別路徑項目關聯。目前,這讓 sbt 可以將編譯產生的 Analysis 與對應的類別路徑項目關聯,並讓受管理項目可以關聯定義相依性的 ModuleIDArtifact

若要明確擷取原始的 Seq[File],請使用隱式新增至 Classpathfiles 方法。

val cp: Classpath = ...
val raw: Seq[File] = cp.files

若要從 Seq[File] 建立 Classpath,請使用 classpath;若要從 File 建立 Attributed[File],請使用 Attributed.blank

val raw: Seq[File] = ...
val cp: Classpath = raw.classpath

val rawFile: File = ..
val af: Attributed[File] = Attributed.blank(rawFile)

非受管理 vs 受管理 

類別路徑、來源程式碼和資源分為兩個主要類別:非受管理和受管理。非受管理檔案是手動建立的檔案,不受建置控制。它們是建置的輸入。受管理檔案則受建置控制。這包括產生的來源程式碼和資源,以及已解析與擷取的相依性和已編譯的類別。

產生受管理檔案的任務應該以下列方式插入:

Compile / sourceGenerators +=
    generate( (Compile / sourceManaged).value / "some_directory")

在此範例中,generateFile => Seq[File] 型別的某個函式,它實際執行工作。因此,我們正在將新的任務附加到主要來源產生器清單 (Compile / sourceGenerators)。

若要插入具名任務,這是外掛程式的較佳方法:

val mySourceGenerator = taskKey[Seq[File]](...)

Compile / mySourceGenerator :=
  generate( (Compile / sourceManaged).value / "some_directory")

Compile / sourceGenerators += (Compile / mySourceGenerator)

task 方法用於參照實際任務,而不是任務的結果。

對於資源,有類似的索引鍵 resourceGeneratorsresourceManaged

依名稱排除來源檔案 

專案基本目錄預設也是一個來源目錄,除了 src/main/scala 之外。您可以依名稱排除來源檔案(以下範例中的 butler.scala),例如:

unmanagedSources / excludeFilter := "butler.scala"

請參閱更多關於 如何在專案資料夾中排除 .scala 來源檔案 - Google 群組 的內容。

外部 vs 內部 

類別路徑也分為內部和外部相依性。內部相依性是專案之間的相依性。它們實際上將一個專案的輸出放在另一個專案的類別路徑上。

外部類別路徑是非受管理和受管理類別路徑的聯集。

索引鍵 

對於類別路徑,相關的索引鍵為:

  • unmanagedClasspath
  • managedClasspath
  • externalDependencyClasspath
  • internalDependencyClasspath

對於來源程式碼:

  • unmanagedSources 這些程式碼預設從 unmanagedSourceDirectories 建構而來,它由 scalaSource 和 javaSource 組成。
  • managedSources 這些是產生的來源程式碼。
  • sources 合併 managedSourcesunmanagedSources
  • sourceGenerators 這些是產生來源檔案的任務。通常,這些任務會將來源程式碼放置在 sourceManaged 提供的目錄中。

對於資源:

  • unmanagedResources 這些程式碼預設從 unmanagedResourceDirectories 建構而來,預設為 resourceDirectory,但不包括與 defaultExcludes 比對的檔案。
  • managedResources 預設情況下,標準專案為空白。sbt 外掛程式會在此處放置產生的描述元檔案。
  • resourceGenerators 這些是產生資源檔案的任務。通常,這些任務會將資源放置在 resourceManaged 提供的目錄中。

如需詳細資訊,請使用inspect 命令

另請參閱相關的 StackOverflow 回答

範例 

您有一個獨立專案,它使用一個在執行時從類別路徑載入 xxx.properties 的函式庫。您將 xxx.properties 放在目錄「config」中。當您執行「sbt run」時,您希望該目錄位於類別路徑中。

Runtime / unmanagedClasspath += baseDirectory.value / "config"