【问题标题】:How to set up plugin downloads over SSL?如何通过 SSL 设置插件下载?
【发布时间】:2014-11-01 14:42:32
【问题描述】:

我有一个使用 sbt-start-script 插件的 SBT 项目。当我运行 SBT 时,插件 jar 是通过不安全的 HTTP 而不是 HTTPS 下载的:

正在下载http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/com.typesafe.sbt/sbt-start-script/scala_2.10/sbt_0.13/0.10.0/jars/sbt-start-script.jar ...

我想改用 https 版本的 repo(我可以手动浏览),但我不知道如何让 SBT 使用它。

我的project/plugins.sbt 看起来像这样:

addSbtPlugin("com.typesafe.sbt" % "sbt-start-script" % "0.10.0")

我尝试将 https 版本添加到 SBT 属性的 [repositories] 部分,并尝试将其添加到 resolvers 列表中,但 SBT 始终使用回购的 http 版本。

addSbtPlugin 会自动添加 repo 吗?

【问题讨论】:

    标签: sbt


    【解决方案1】:

    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.repossbt.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)))
    

    【讨论】:

    • 如果我的 build.sbt 列出了其他 repos 怎么办?有没有办法只禁用隐式添加的http://repo.scala-sbt.org 而不禁用所有它们?
    • 我认为这将需要一个在启动时执行的命令,将所有 repos 替换为它们的 https 对应物 - 我认为 sbt 开箱即用没有任何可用的东西,但是碎片是。
    • 刚刚编辑了我的答案,看来-Dsbt.override.build.repos=true 非常强大(超出了我最初的理解!)这有帮助吗?
    • 我放弃了,决定只使用 -Dsbt.override.build.repos=true 并将所有额外的 repos 包含在 .properties 文件中而不是构建文件中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2012-04-10
    • 2020-06-25
    • 2023-01-30
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多