このページでは、プロジェクトを公開する方法について説明します。公開とは、Ivy ファイルや Maven POM などの記述子と、jar や war などのアーティファクトをリポジトリにアップロードして、他のプロジェクトが依存関係としてプロジェクトを指定できるようにすることです。
publish アクションは、プロジェクトをリモート リポジトリに公開するために使用されます。公開を使用するには、公開先のリポジトリと使用する資格情報を指定する必要があります。設定が完了したら、publish を実行できます。
publishLocal アクションは、プロジェクトを Ivy ローカルファイル リポジトリに公開するために使用されます。これは通常、$HOME/.ivy2/local/ にあります。その後、同じマシン上の他のプロジェクトからこのプロジェクトを使用できます。
プロジェクトの公開を回避するには、スキップするサブプロジェクトに次の設定を追加します
publish / skip := true
一般的なユースケースは、ルートプロジェクトの公開を防ぐことです。
リポジトリを指定するには、リポジトリを publishTo に割り当て、必要に応じて公開スタイルを設定します。たとえば、Nexus にアップロードするには
publishTo := Some("Sonatype Snapshots Nexus" at "https://oss.sonatype.org/content/repositories/snapshots")
ローカル Maven リポジトリに公開するには
publishTo := Some(MavenCache("local-maven", file("path/to/maven-repo/releases")))
ローカル Ivy リポジトリに公開するには
publishTo := Some(Resolver.file("local-ivy", file("path/to/ivy-repo/releases")))
Maven リポジトリを使用している場合は、アーティファクトに応じて適切なリポジトリを選択する必要があります。SNAPSHOT バージョンは /snapshot リポジトリに送られ、他のバージョンは /releases リポジトリに送られます。この選択は、isSnapshot SettingKey の値を使用して行うことができます。
publishTo := {
val nexus = "https://my.artifact.repo.net/"
if (isSnapshot.value)
Some("snapshots" at nexus + "content/repositories/snapshots")
else
Some("releases" at nexus + "service/local/staging/deploy/maven2")
}
publishLocal タスクは、「ローカル」Ivy リポジトリに公開します。デフォルトでは、これは $HOME/.ivy2/local/ です。同じマシン上の他のビルドは、プロジェクトを依存関係としてリストできます。たとえば、公開しているプロジェクトに次のような設定パラメータがある場合
ThisBuild / organization := "org.me"
ThisBuild / version := "0.1-SNAPSHOT"
name := "My Project"
同じマシン上の別のビルドは、それに依存できます
libraryDependencies += "org.me" %% "my-project" % "0.1-SNAPSHOT"
選択するバージョン番号は SNAPSHOT で終わる必要があります。そうでない場合は、変更されているアーティファクトであることを示すために、公開するたびにバージョン番号を変更する必要があります。
**注**:SNAPSHOT 依存関係は、依存関係の解決を遅くし、ビルドを再現不可能にするため、ローカルテスト以外では避ける必要があります。
publishLocal と同様に、publishM2 タスクはユーザーの Maven ローカルリポジトリに公開します。これは、$HOME/.m2/settings.xml で指定された場所、またはデフォルトでは $HOME/.m2/repository/ にあります。別のビルドでは、そこから解決するために Resolver.mavenLocal が必要になります。
resolvers += Resolver.mavenLocal
詳細はリゾルバーを参照してください。
このようなリポジトリの資格情報を指定するには、2つの方法があります。
最初にしてより良い方法は、ファイルからロードすることです。たとえば、
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")
資格情報ファイルは、realm、host、user、および password のキーを持つプロパティファイルです。たとえば、
realm=Sonatype Nexus Repository Manager
host=my.artifact.repo.net
user=admin
password=admin123
2つ目の方法は、インラインで指定することです
credentials += Credentials("Sonatype Nexus Repository Manager", "my.artifact.repo.net", "admin", "admin123")
**注**:資格情報の一致は、realm と host の両方のキーを使用して行われます。 realm キーは、HTTP WWW-Authenticate ヘッダーの realm ディレクティブであり、HTTP ベーシック認証 のための HTTP サーバーのレスポンスの一部です。指定されたリポジトリの場合、これは受信したすべてのヘッダーを読み取ることで見つけることができます。たとえば、
curl -D - my.artifact.repo.net
複数の互換性のない Scala バージョンをサポートするには、クロスビルドを有効にして、+ publish を実行します(クロスビルドを参照)。サポートされている他のリポジトリタイプについては、[リゾルバー] を参照してください。
デフォルトでは、sbt は使用している Scala のバイナリバージョンでアーティファクトを公開します。たとえば、プロジェクトで Scala 2.13.x を使用している場合、例のアーティファクトは example_2.13 で公開されます。これは多くの場合、必要なものですが、純粋な Java アーティファクトまたはコンパイラプラグインを公開する場合は、CrossVersion を変更する必要があります。詳細は、クロスビルドページの *公開規則のオーバーライド* セクションを参照してください。
デフォルトでは、メインのバイナリ jar、ソース jar、および API ドキュメント jar が公開されます。公開する他のタイプのアーティファクトを宣言し、デフォルトのアーティファクトを無効にしたり変更したりできます。詳細は、アーティファクトページを参照してください。
publishMavenStyle が true の場合、POM は makePom アクションによって生成され、Ivy ファイルの代わりにリポジトリに公開されます。この POM ファイルは、いくつかの設定を変更することで変更できます。生成された pom に直接挿入する XML (scala.xml.NodeSeq) を提供するには、pomExtra を設定します。たとえば、
pomExtra := <something></something>
最終的な XML を書き込む前に操作するために使用できる pomPostProcess 設定もあります。そのタイプは Node => Node です。
pomPostProcess := { (node: Node) =>
...
}
makePom は、宣言した Maven スタイルのリポジトリを POM に追加します。ローカルリポジトリを除外するデフォルトの pomRepositoryFilter を変更することで、これらをフィルタリングできます。代わりにローカルリポジトリのみを含めるには、
pomIncludeRepository := { (repo: MavenRepository) =>
repo.root.startsWith("file:")
}
sbt 1.4.0 は、ビルドのバージョン方式を追跡するための ThisBuild / versionScheme という新しい設定を追加します
ThisBuild / versionScheme := Some("early-semver")
サポートされる値は、"early-semver"、"pvp"、"semver-spec"、および "strict" です。 sbt はこの情報をプロパティとして pom.xml と ivy.xml に含めます。
| versionScheme | 説明 |
|---|---|
Some("early-semver") | 0.Y.z 内のパッチ更新全体でバイナリ互換性を維持する初期セマンティックバージョニング(たとえば、0.13.0 と 0.13.2)。1.0.0 に達すると、1.1.0 が 1.0.0 とバイナリ互換性がある通常のセマンティックバージョニングに従います。 |
Some("semver-spec") | すべての 0.y.z が初期開発として扱われるセマンティックバージョニング(バイナリ互換性の保証なし) |
Some("pvp") | X.Y がメジャーバージョンとして扱われるHaskell パッケージバージョニングポリシー |
Some("strict") | バージョンの完全一致が必要 |