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 のフルバージョン文字列とバイナリ互換部分のバージョン文字列を提供します。文字列の結果は、生成されるファイルの名前です。デフォルトの実装は `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(...)
  )

.war ファイルの公開 

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"))