tl;dr 使用 https 版本创建 ~/.sbt/repositories 或创建具有不同非默认名称的存储库文件并使用 -Dsbt.override.build.repos=true 和 -Dsbt.repository.config=path-to-the-repositories-file 运行 sbt。
让我们从默认的构建定义开始 - 没有额外的设置,但 sbt 本身附带。
show fullResolvers 了解自动管理依赖项的外部解析器 - 共有三个解析器(格式是我的以便于阅读)。
➜ https-repositories xsbt
...
> show fullResolvers
[info] ArrayBuffer(
Raw(ProjectResolver(inter-project, mapped: )),
FileRepository(local,FileConfiguration(true,None),Patterns(ivyPatterns=List(${ivy.home}/local/[organisation]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]), artifactPatterns=List(${ivy.home}/local/[organisation]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]), isMavenCompatible=false, descriptorOptional=false, skipConsistencyCheck=false)),
public: https://repo1.maven.org/maven2/)
Command Line Options 说:
-
sbt.override.build.repos 如果true,则忽略构建定义中配置的存储库,而使用为启动器配置的存储库。请参阅 sbt.repository.config 和 sbt 启动器文档。
-
sbt.repository.config 包含用于启动器的存储库的文件。格式与 sbt 启动器配置文件的 [repositories] 部分相同。此设置通常与将 sbt.override.build.repos 设置为 true 结合使用(请参阅上一行和 sbt 启动器文档)。
这意味着当 sbt 找到 ~/.sbt/repositories 和 [repositories] 时,它们将成为 sbt 的解析器。
使用以下内容创建~/.sbt/repositories:
[repositories]
httpsInstead: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/,[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
您可能已经注意到,文件仅定义了相关存储库的 https 版本。
reload 会话(或重新开始)并执行show fullResolvers。
➜ https-repositories ls ~/.sbt/repositories
/Users/jacek/.sbt/repositories
➜ https-repositories xsbt
...
> show fullResolvers
[info] ArrayBuffer(
Raw(ProjectResolver(inter-project, mapped: )),
URLRepository(httpsInstead,Patterns(ivyPatterns=List(https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]), artifactPatterns=List(https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]), isMavenCompatible=false, descriptorOptional=false, skipConsistencyCheck=false)))
现在有两个解析器!
让我们使用 sbt.* 选项 - sbt.override.build.repos 和 sbt.repository.config。
➜ https-repositories ls ~/.sbt/my_repositories
/Users/jacek/.sbt/my_repositories
➜ https-repositories ls ~/.sbt/repositories*
zsh: no matches found: /Users/jacek/.sbt/repositories*
➜ https-repositories SBT_OPTS="-Dsbt.override.build.repos=false -Dsbt.repository.config=/Users/jacek/.sbt/my_repositories" xsbt
...
> show fullResolvers
[info] ArrayBuffer(
Raw(ProjectResolver(inter-project, mapped: )),
URLRepository(httpsInstead,Patterns(ivyPatterns=List(https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]), artifactPatterns=List(https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]), isMavenCompatible=false, descriptorOptional=false, skipConsistencyCheck=false)))
又有两个解析器了。
看来sbt.override.build.repos=true的变化不大。
➜ https-repositories SBT_OPTS="-Dsbt.override.build.repos=true -Dsbt.repository.config=/Users/jacek/.sbt/my_repositories" xsbt
...
> show fullResolvers
[info] ArrayBuffer(
Raw(ProjectResolver(inter-project, mapped: )),
URLRepository(httpsInstead,Patterns(ivyPatterns=List(https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]), artifactPatterns=List(https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]), isMavenCompatible=false, descriptorOptional=false, skipConsistencyCheck=false)))
有趣的是,sbt.override.build.repos=true 的解析器更改为 sbt 项目构建。
这是一个示例build.sbt,带有一个虚构的存储库:
resolvers += "build.sbt" at "http://my.repository.com"
第一个会话是-Dsbt.override.build.repos=false:
➜ https-repositories SBT_OPTS="-Dsbt.override.build.repos=false -Dsbt.repository.config=/Users/jacek/.sbt/my_repositories" xsbt
...
> show fullResolvers
[info] ArrayBuffer(
Raw(ProjectResolver(inter-project, mapped: )),
URLRepository(httpsInstead,Patterns(ivyPatterns=List(https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]), artifactPatterns=List(https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]), isMavenCompatible=false, descriptorOptional=false, skipConsistencyCheck=false)),
build.sbt: http://my.repository.com)
与-Dsbt.override.build.repos=true 的另一个会话:
➜ https-repositories SBT_OPTS="-Dsbt.override.build.repos=true -Dsbt.repository.config=/Users/jacek/.sbt/my_repositories" xsbt
...
> show fullResolvers
[info] ArrayBuffer(
Raw(ProjectResolver(inter-project, mapped: )),
URLRepository(httpsInstead,Patterns(ivyPatterns=List(https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]), artifactPatterns=List(https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]), isMavenCompatible=false, descriptorOptional=false, skipConsistencyCheck=false)))