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 依赖项应避免在本地测试之外使用,因为它会使依赖项解析速度变慢,并且构建不可重复。

类似于 publishLocalpublishM2 任务将发布到用户的 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")需要与版本完全匹配