1. 發佈

發佈 

此頁面說明如何發佈您的專案。發佈包括將描述符(例如 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

請參閱 解析器 以取得更多詳細資訊。

憑證 

有兩種方法可以為此類儲存庫指定憑證。

第一種也是較好的方法是從檔案載入它們,例如

credentials += Credentials(Path.userHome / ".sbt" / ".credentials")

憑證檔案是一個屬性檔案,包含 realmhostuserpassword 等索引鍵。例如

realm=Sonatype Nexus Repository Manager
host=my.artifact.repo.net
user=admin
password=admin123

第二種方法是內嵌指定它們

credentials += Credentials("Sonatype Nexus Repository Manager", "my.artifact.repo.net", "admin", "admin123")

注意:憑證比對是使用 realmhost 索引鍵完成的。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。您可以宣告其他要發佈的構件類型,並停用或修改預設構件。請參閱 構件 頁面以取得詳細資訊。

修改產生的 POM 

publishMavenStyletrue 時,makePom 動作會產生 POM,並將其發佈到儲存庫,而不是 Ivy 檔案。可以透過變更一些設定來更改此 POM 檔案。設定 pomExtra 以提供 XML (scala.xml.NodeSeq) 以直接插入產生的 pom。例如

pomExtra := <something></something>

還有一個 pomPostProcess 設定,可用於在寫入之前操作最終的 XML。它的類型為 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.xmlivy.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")Haskell 套件版本控制策略,其中 X.Y 被視為主版本
Some("strict")需要完全符合版本