預設情況下,發佈的構件是主要的二進位 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 任務 (package
、packageDoc
或 packageSrc
) 取得 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(...)
)
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"))
from
和 classifer
方法(在 函式庫管理 頁面上描述)實際上是轉換為 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"))