此頁面討論 sbt 如何為不同的動作(例如 compile
、run
和 test
)建構類別路徑,以及如何覆寫或擴增這些類別路徑。
在 sbt 中,類別路徑包含 Scala 函式庫以及(在宣告為相依性時)Scala 編譯器。與類別路徑相關的設定與任務通常會提供 Classpath
型別的值。這是 Seq[Attributed[File]]
的別名。Attributed 是一種型別,它將異質對應與每個類別路徑項目關聯。目前,這讓 sbt 可以將編譯產生的 Analysis
與對應的類別路徑項目關聯,並讓受管理項目可以關聯定義相依性的 ModuleID
和 Artifact
。
若要明確擷取原始的 Seq[File]
,請使用隱式新增至 Classpath
的 files
方法。
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)
類別路徑、來源程式碼和資源分為兩個主要類別:非受管理和受管理。非受管理檔案是手動建立的檔案,不受建置控制。它們是建置的輸入。受管理檔案則受建置控制。這包括產生的來源程式碼和資源,以及已解析與擷取的相依性和已編譯的類別。
產生受管理檔案的任務應該以下列方式插入:
Compile / sourceGenerators +=
generate( (Compile / sourceManaged).value / "some_directory")
在此範例中,generate
是 File => Seq[File]
型別的某個函式,它實際執行工作。因此,我們正在將新的任務附加到主要來源產生器清單 (Compile / sourceGenerators
)。
若要插入具名任務,這是外掛程式的較佳方法:
val mySourceGenerator = taskKey[Seq[File]](...)
Compile / mySourceGenerator :=
generate( (Compile / sourceManaged).value / "some_directory")
Compile / sourceGenerators += (Compile / mySourceGenerator)
task
方法用於參照實際任務,而不是任務的結果。
對於資源,有類似的索引鍵 resourceGenerators
和 resourceManaged
。
專案基本目錄預設也是一個來源目錄,除了 src/main/scala
之外。您可以依名稱排除來源檔案(以下範例中的 butler.scala
),例如:
unmanagedSources / excludeFilter := "butler.scala"
請參閱更多關於 如何在專案資料夾中排除 .scala 來源檔案 - Google 群組 的內容。
類別路徑也分為內部和外部相依性。內部相依性是專案之間的相依性。它們實際上將一個專案的輸出放在另一個專案的類別路徑上。
外部類別路徑是非受管理和受管理類別路徑的聯集。
對於類別路徑,相關的索引鍵為:
unmanagedClasspath
managedClasspath
externalDependencyClasspath
internalDependencyClasspath
對於來源程式碼:
unmanagedSources
這些程式碼預設從 unmanagedSourceDirectories 建構而來,它由 scalaSource 和 javaSource 組成。managedSources
這些是產生的來源程式碼。sources
合併 managedSources
和 unmanagedSources
。sourceGenerators
這些是產生來源檔案的任務。通常,這些任務會將來源程式碼放置在 sourceManaged 提供的目錄中。對於資源:
unmanagedResources
這些程式碼預設從 unmanagedResourceDirectories 建構而來,預設為 resourceDirectory,但不包括與 defaultExcludes 比對的檔案。managedResources
預設情況下,標準專案為空白。sbt 外掛程式會在此處放置產生的描述元檔案。resourceGenerators
這些是產生資源檔案的任務。通常,這些任務會將資源放置在 resourceManaged 提供的目錄中。如需詳細資訊,請使用inspect 命令。
另請參閱相關的 StackOverflow 回答。
您有一個獨立專案,它使用一個在執行時從類別路徑載入 xxx.properties 的函式庫。您將 xxx.properties 放在目錄「config」中。當您執行「sbt run」時,您希望該目錄位於類別路徑中。
Runtime / unmanagedClasspath += baseDirectory.value / "config"