デフォルトでは、公開されるアーティファクトは、メインのバイナリ 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 のフルバージョン文字列とバイナリ互換部分のバージョン文字列を提供します。文字列の結果は、生成されるファイルの名前です。デフォルトの実装は `Artifact.artifactName _` です。この関数は、リポジトリパターンと組み合わされた `artifact` 定義によって決定される公開名に影響を与えることなく、アーティファクトの異なるローカル名を生成するように変更できます。
たとえば、分類子またはクロスパスなしで最小限の名前にするには
artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
artifact.name + "-" + module.revision + "." + artifact.extension
}
(実際には、分類子を削除することはめったにありません。)
最後に、`packagedArtifact` タスクをマッピングすることで、アーティファクトの `(Artifact, File)` ペアを取得できます。 `Artifact` が不要な場合は、`package` タスク (`package`、`packageDoc`、または `packageSrc`) からファイルのみを取得できます。どちらの場合も、タスクをマッピングしてファイルを取得することで、アーティファクトが最初に生成されるため、ファイルが最新の状態であることが保証されます。
例えば
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 アプリケーションの一般的なユースケースは、`.jar` ファイルの代わりに `.war` ファイルを公開することです。
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))
つまり、次の 2 つの依存関係宣言は同等です
libraryDependencies += ("org.testng" % "testng" % "5.7").classifier("jdk15")
libraryDependencies += ("org.testng" % "testng" % "5.7").artifacts(Artifact("testng", "jdk15"))