此頁面說明如何發佈您的專案。發佈包括將描述符(例如 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")
憑證檔案是一個屬性檔案,包含 realm
、host
、user
和 password
等索引鍵。例如
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")
注意:憑證比對是使用 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
時,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.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") | Haskell 套件版本控制策略,其中 X.Y 被視為主版本 |
Some("strict") | 需要完全符合版本 |