【问题标题】:sbt 0.11: Using a corporate maven repositorysbt 0.11:使用企业 Maven 存储库
【发布时间】:2012-02-25 06:56:13
【问题描述】:

how do I get sbt to use a local maven proxy repository (Nexus)? 中所述,如何将企业 Maven 存储库与 sbt 0.11.x 一起使用(不包括其他存储库)?在 github 的新 sbt wiki 中没有提到 ivyRepositories,所以我假设接受的解决方案已经过时了。

【问题讨论】:

    标签: maven sbt


    【解决方案1】:

    第 1 步:按照Detailed Topics: Proxy Repositories 的说明进行操作,我已将其总结并添加到以下内容:

    1. (如果您使用 Artifactory,则可以跳过此步骤。)在您的公司 Maven 存储库上创建一个完全独立的 Maven 代理存储库(或组),以代理 ivy-style 存储库,例如这两个重要的存储库:

      这是必需的,因为某些存储库管理器无法处理混合在一起的 Ivy 风格和 Maven 风格的存储库。

    2. 创建一个文件repositories,列出您的主要公司存储库以及您在步骤 1 中创建的任何额外存储库,格式如下:

      [repositories]
        my-maven-proxy-releases: http://repo.example.com/maven-releases/
        my-ivy-proxy-releases: http://repo.example.com/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
      
    3. 要么将该文件保存在主目录内的 .sbt 目录中,要么在 sbt 命令行中指定它(如果有 disabled sharing,则需要指定):

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

    对于那些使用旧版本 sbt 的人来说是个好消息:尽管至少在 sbt 0.12.0 启动器 jar 中,旧 sbt 版本的启动属性文件不包含所需的行 (提到repository.config)的那个,如果您编辑这些文件以添加所需的行并将它们重新打包到sbt 0.12.0启动器jar中,它仍然适用于那些版本的sbt!这是因为该功能是在启动器中实现的,而不是在 sbt 本身中实现的。并且 sbt 0.12.0 启动器声称能够启动所有版本的 sbt,直接回到 0.7!

    第 2 步:为确保未使用外部存储库,请从解析器中删除默认存储库。这可以通过以下三种方式之一完成:

    1. 添加上面详细主题页面中提到的命令行选项-Dsbt.override.build.repos=true。这将导致您在文件中指定的存储库覆盖在任何 sbt 文件中指定的任何存储库。不过,这可能仅适用于 sbt 0.12 及更高版本 - 我还没有尝试过。
    2. 与1效果相同,可以使用overrideBuildResolvers := true,好处是可以控制适用的项目,具体取决于你定义的范围(一个项目/ThisBuild/Global) in. 这在 sbt 0.13 中有效。
    3. 在您的构建文件中使用fullResolvers := Seq( 解析器 ),而不是resolvers ++=resolvers := 或您以前使用的任何东西。

    最后,请注意 sbt 启动器脚本在读取 sbtopts 文件时存在错误,因此如果您决定将常用的 sbt 命令行选项放在那里,请确保文件的最后一行以换行符结尾(特别是 Emacs 可能无法确保这一点,除非配置为这样做)。

    【讨论】:

    • 我尝试在 build.sbt 中使用第 2 步设置 overrideBuildResolvers := true 的选项 2,但这对我不起作用。设置时有什么需要特别注意的吗?
    • 在使用 Windows 时,请注意 sbt -Dsbt.override.build.repos=true 会给你一个警告并且标志被忽略。您应该使用 -D"sbt.override.build.repos=true",我相信由于某些 cmd 魔法,需要双引号。
    【解决方案2】:

    已接受答案的第 2 步的替代方案(我正在使用 sbt 0.13.1):

    将文件.sbtopts添加到项目根目录,内容如下:

    -Dsbt.override.build.repos=true
    

    另一种选择是在$SBT_HOME/conf/.sbtopts 中添加这一行,但这会强制所有项目的设置。

    【讨论】:

    • 您也可以在第 1 步中使用它并将 -Dsbt.repository.config=&lt;…&gt; 配置放入其中。这样,可以在每个项目的基础上设置完整的 repo 配置并将其添加到代码存储库中。
    【解决方案3】:

    解压 sbt-launcher.jar 并将 sbt.boot.properties 文件复制到您选择的位置。更改启动脚本以使用此文件。在文件中,将 repositories 部分更改为仅包含您的本地存储库和公司存储库。 Maven 和 Ivy 的区别来自于给定的模式(没有模式默认是 Maven 模式)。

    这是一个例子:

    [repositories]
      local
      corporate: http://inhouse.acme.com/releases/
    

    【讨论】:

    • 我试过了,但是没有用。它甚至根本没有尝试企业存储库!也许这里有些混乱。我希望默认使用公司存储库,而不必在 build.sbt 中指定它。
    • 没有混淆,@HeikoSeeberger 的答案应该完全符合您的要求:将您的公司存储库替换为 Maven 中心。如果它不适合你,sbt 可能没有拾取你修改的sbt.boot.properties 文件。如前所述,您必须修改 sbt 启动脚本以告诉 sbt 使用修改后的文件: java -Dsbt.boot.properties=sbt.boot.properties -jar dirname $0/sbt-launch-0.11.2.jar "$ @" (假设你把修改后的sbt.boot.properties和sbt本身放在同一个目录下。)
    • 我也试过了,还是不行。它肯定会读取我的自定义 sbt.boot.properties,因为如果我输入语法错误,sbt 将不会加载。如果我删除所有存储库,sbt 将无法解析所需的工件。但是,当工件已经在 Nexus 存储库中并且配置了 sbt.boot.properties 时,sbt 仍然不会得到它!
    • 我可以确认在 sbt 0.11.2 中,从 sbt.boot.properties 编辑存储库完全没有效果,使用以下命令:show external-resolvers
    • 也许您在构建中以错误的方式配置解析器?您是添加到解析器还是只是设置一些值? IE。您使用的是 += 还是 ++= 运算符?
    猜你喜欢
    • 2013-05-01
    • 2014-11-13
    • 1970-01-01
    • 2014-03-01
    • 2011-12-15
    • 1970-01-01
    • 2015-02-23
    • 2012-04-19
    • 2013-03-19
    相关资源
    最近更新 更多