1. 代理仓库

代理仓库 

用户通常希望在公司防火墙内设置一个 Maven/Ivy 代理仓库,并让开发人员的 sbt 实例通过该代理解析构件。让我们详细说明需要进行哪些更改才能使它正常工作。

概述 

当组织内的许多开发人员试图解析构件时,就会出现这种情况。每个开发人员的机器都会访问互联网并下载构件,无论团队中的其他人是否已经下载过。代理仓库为组织提供了一个单一的远程下载点。除了控制和安全问题外,代理仓库对于提高团队的整体速度至关重要。

image

市场上有很多优秀的代理仓库解决方案。

安装和配置好代理仓库后,就可以根据需要配置 sbt。请阅读底部关于 Ivy 仓库代理问题的说明。

sbt 配置 

sbt 需要在两个地方进行配置才能使用代理仓库。第一个是 ~/.sbt/repositories 文件,第二个是启动器脚本。

~/.sbt/repositories 

仓库文件是启动器的外部配置。配置文件的精确语法在 sbt 启动器配置 中有详细说明。

以下是一个示例配置。

[repositories]
  local
  my-ivy-proxy-releases: http://repo.company.com/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
  my-maven-proxy-releases: http://repo.company.com/maven-releases/

此示例配置为 sbt 配置了三个仓库。

第一个解析器是 local,用于使使用 publishLocal 推送的构件在其他 sbt 项目中可见。

第二个解析器是 my-ivy-proxy-releases。此仓库用于从公司代理仓库解析 sbt 本身以及可能需要的任何 sbt 插件。请注意,Ivy 解析器模式很重要,请确保你的模式与所示模式匹配,否则可能无法解析 sbt 插件。

最后一个解析器是 my-maven-proxy-releases。此仓库是所有标准 Maven 仓库的代理,包括 Maven 中央仓库。

此仓库文件是使用代理仓库所需的一切。这些仓库将在任何 sbt 构建中首先被包含,但你可以添加一些额外的配置来强制使用代理仓库而不是其他配置。

使用代理仓库的凭据 

如果你需要定义凭据来连接到代理仓库,请定义一个指向包含你凭据的文件的环境变量 SBT_CREDENTIALS

export SBT_CREDENTIALS="$HOME/.ivy2/.credentials"

文件内容如下

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

如果上述方法不适用于你的系统,另一种方法是通过以下方法显式提供引导凭据

-Dsbt.boot.credentials="$HOME/.ivy2/.credentials"

并直接将凭据添加到你的构建文件中

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

启动器脚本 

sbt 启动器支持两个配置选项,允许使用代理仓库。第一个是 sbt.override.build.repos 设置,第二个是 sbt.repository.config 设置。

sbt.override.build.repos 

此设置用于指定应忽略所有 sbt 项目添加的解析器,而应优先使用 repositories 配置中配置的解析器。将其与正确配置的 ~/.sbt/repositories 文件一起使用会导致构建仅使用你的代理仓库。

指定方式如下

-Dsbt.override.build.repos=true

默认值为 false,必须显式启用。

sbt.repository.config 

如果你无法创建 ~/.sbt/repositories 文件(由于用户权限错误或为了开发人员的方便),你可以使用以下方法直接修改 sbt 启动脚本

-Dsbt.repository.config=<path-to-your-repo-file>

只有在用户还没有自己的默认仓库文件时才需要这样做。

代理 Ivy 仓库 

设置 sbt 代理仓库时最常见的错误是试图将 MavenIvy 仓库合并同一个代理仓库中。虽然有些仓库管理器允许这样做,但并不建议这样做。

即使你的公司没有使用 Ivy,sbt 也使用自定义布局来处理其自身插件的二进制兼容性约束。为了确保这些能够正确解析,只需设置两个虚拟/代理仓库,一个用于 Maven,一个用于 Ivy。

以下是一个示例设置。

image

注意:如果使用 Nexus 作为代理仓库,那么为映射到上游仓库 https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases 的代理映射设置“宽松”布局策略非常重要。如果不这样做,Nexus 将无法代理到该 url 的原始请求,而是会发出 HTTP 404,导致依赖项无法解析。