1. 構件

構件 

選取預設構件 

預設情況下,發佈的構件是主要的二進位 jar 檔、包含主要來源和資源的 jar 檔,以及包含 API 文件的 jar 檔。您可以新增測試類別、來源或 API 的構件,也可以停用一些主要的構件。

若要新增所有測試構件

lazy val app = (project in file("app"))
  .settings(
    Test / publishArtifact := true,
  )

若要個別新增

lazy val app = (project in file("app"))
  .settings(
    // enable publishing the jar produced by `Test/package`
    Test / packageBin / publishArtifact := true,

    // enable publishing the test API jar
    Test / packageDoc / publishArtifact := true,

    // enable publishing the test sources jar
    Test / packageSrc / publishArtifact := true,
  )

若要個別停用主要構件

lazy val app = (project in file("app"))
  .settings(
    // disable publishing the main jar produced by `package`
    Compile / packageBin / publishArtifact := false,

    // disable publishing the main API jar
    Compile / packageDoc / publishArtifact := false,

    // disable publishing the main sources jar
    Compile / packageSrc / publishArtifact := false,
  )

修改預設構件 

每個內建構件除了 publishArtifact 之外,還有幾個可組態的設定。基本設定有 artifact (類型為 SettingKey[Artifact])、mappings (類型為 TaskKey[(File, String)]) 和 artifactPath (類型為 SettingKey[File])。它們的作用域為 (Config / <task>),如上一節所示。

例如,若要修改主要構件的類型

Compile / packageBin / artifact := {
  val prev: Artifact = (Compile / packageBin / artifact).value
  prev.withType("bundle")
}

產生的構件名稱由 artifactName 設定決定。此設定的類型為 (ScalaVersion, ModuleID, Artifact) => String。ScalaVersion 引數提供完整的 Scala 版本字串和版本字串的二進位相容部分。String 結果是要產生的檔案名稱。預設實作為 Artifact.artifactName _。可以修改此函數以產生不同的構件本機名稱,而不會影響發佈的名稱,發佈的名稱由 artifact 定義與儲存庫模式組合決定。

例如,若要產生不含分類器或交叉路徑的最小名稱

artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
  artifact.name + "-" + module.revision + "." + artifact.extension
}

(請注意,實際上您很少會想要捨棄分類器。)

最後,您可以透過對應 packagedArtifact 任務來取得構件的 (Artifact, File) 配對。請注意,如果您不需要 Artifact,您可以只從 package 任務 (packagepackageDocpackageSrc) 取得 File。在這兩種情況下,對應任務以取得檔案可確保先產生構件,因此保證檔案是最新的。

例如

val myTask = taskKey[Unit]("My task.")

myTask :=  {
  val (art, file) = (Compile / packageBin / packagedArtifact).value
  println("Artifact definition: " + art)
  println("Packaged file: " + file.getAbsolutePath)
}

定義自訂構件 

除了設定內建構件之外,您還可以宣告其他要發佈的構件。當使用 Ivy 元數據時,允許多個構件,但 Maven POM 檔案僅支援根據分類器區分構件,而這些構件不會記錄在 POM 中。

基本的 Artifact 建構如下所示

Artifact("name", "type", "extension")
Artifact("name", "classifier")
Artifact("name", url: URL)
Artifact("name", Map("extra1" -> "value1", "extra2" -> "value2"))

例如

Artifact("myproject", "zip", "zip")
Artifact("myproject", "image", "jpg")
Artifact("myproject", "jdk15")

如需有關構件的詳細資訊,請參閱 Ivy 文件。如需組合上述參數和指定 [組態] 和額外屬性的詳細資訊,請參閱 Artifact API

若要宣告這些要發佈的構件,請將它們對應到產生構件的任務

val myImageTask = taskKey[File](...)

myImageTask := {
  val artifact: File = makeArtifact(...)
  artifact
}

addArtifact(Artifact("myproject", "image", "jpg"), myImageTask)

addArtifact 會傳回一連串設定(包裝在 SettingsDefinition 中)。在完整的建置組態中,用法如下

lazy val app = (project in file("app"))
  .settings(
    addArtifact(...)
  )

發佈 .war 檔案 

Web 應用程式的常見使用案例是發佈 .war 檔案而不是 .jar 檔案。

lazy val app = (project in file("app"))
  .settings(
    // disable .jar publishing
    Compile / packageBin / publishArtifact := false,

    // create an Artifact for publishing the .war file
    Compile / packageWar / artifact := {
      val prev: Artifact = (Compile / packageWar / artifact).value
      prev.withType("war").withExtension("war")
    },

    // add the .war file to what gets published
    addArtifact(Compile / packageWar / artifact, packageWar),
  )

將依賴與構件搭配使用 

若要指定從具有自訂或多個構件的依賴項目使用的構件,請在您的依賴項目上使用 artifacts 方法。例如

libraryDependencies += ("org" % "name" % "rev").artifacts(Artifact("name", "type", "ext"))

fromclassifer 方法(在 函式庫管理 頁面上描述)實際上是轉換為 artifacts 的便利方法

def from(url: String) = artifacts(Artifact(name, new URL(url)))
def classifier(c: String) = artifacts(Artifact(name, c))

也就是說,下列兩個依賴宣告是等效的

libraryDependencies += ("org.testng" % "testng" % "5.7").classifier("jdk15")

libraryDependencies += ("org.testng" % "testng" % "5.7").artifacts(Artifact("testng", "jdk15"))