【问题标题】:Maven setting.xml equivalent for sbtsbt 的 Maven setting.xml 等效项
【发布时间】:2016-12-04 08:35:46
【问题描述】:

为了保持工件分开,区分包的来源和我的开发环境干净;我对项目组使用单独的 settings.xml 文件。因此,我使用以下命令调用 maven:

mvn -s $PROJECT_ROOT/mvn_settings.xml compile

如何以类似的方式配置 sbt?我的工作场所提供了一个内部托管的 JFrog 存储库,它启用了 sbt 和 Ivy 插件。我尝试使用各种关键字查找搜索引擎,但找不到匹配的文档。 如果相关,我将 IntelliJ Idea CE 与 Scala 插件一起使用。

编辑 1:我希望能够控制我的工件的存储位置、它们的来源以及它们与各个项目的关联。

编辑2:考虑两个settings.xml的

  1. 对于我的随机项目,来自 maven Central 的库最少:https://pastebin.com/nLc1PGa3

  2. 我公司的项目在一个大箱子里:https://pastebin.com/R6a4jGQC 全部来自不同的来源,在各自的文件夹中。我也可以独立移动我的项目,不用担心哪个依赖链接可能会破坏其他不相关的东西。

【问题讨论】:

  • 我希望能够控制我的工件的存储位置、它们的来源以及它们与各个项目的关联。 存储库管理不能解决工件的关联问题吗?还是您想为每个项目使用不同的存储库?
  • 每个项目都有一个不同的存储库,并让这些工件的本地副本位于不同的目录中。这我可以在 Maven 中实现。如何在 sbt 中做到这一点对我来说很神秘。
  • 我仍然没有得到你的关注。您能否解释一下问题中已经使用 maven 可以获得的结构。
  • 考虑两个 settings.xml 的 1. 对于我的随机项目,其中包含来自 maven Central 的最小库:pastebin.com/nLc1PGa3 2. 我公司的项目在一个大箱子中:pastebin.com/R6a4jGQC 全部来自不同的来源,在他们自己的相应的文件夹。我也可以独立移动我的项目,不用担心哪个依赖链接可能会破坏其他无关的东西。
  • 看着settings.xml,我怀疑你推断有关maven的事情的方式。在您共享的 first 链接(最小库)中,您实际上是在本地计算机上指定一个目录而不是 .m2 来保存 maven 构建的工件。而在 second link shared(company's project) 您已经指定了各种存储库路径,如果您的本地 maven 存储库中尚未找到,您希望 maven 从中获取工件。

标签: scala maven sbt


【解决方案1】:

首先在 Maven 中按 settings.xml 进行分组并不是最好的方法。更好的是使用存储库管理器,它可以具有到特定存储库的路由,并将存储库及其特定意图分开。 (多年来我一直在使用一个未更改的 settings.xml。只有我的存储库管理器中的配置在处理这个问题;这让生活更轻松,在 CI 系统上也是如此)。

基于docs of sbt,您可以在~/.sbt/repositories 文件中像这样配置代理存储库:

[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/

【讨论】:

    【解决方案2】:

    尽管稍后或很快我会建议在您正在构建的任何项目中遵循与@khmarbaise 相同的做法。 因为如果它们来自相同的 groupartifact 或者即使它们与 maven/sbt 不同,则似乎没有必要为存储库保留不同的文件夹,从而为构建不同的项目提供支持使用不同指定的依赖项。

    与 maven 类似,build.sbt 可以有一个 Build Settings Concatenation,它可以作为 -

    它们按以下顺序附加:

    • .scala 文件中 Build.settings 和 Project.settings 的设置。
    • 您的用户全局设置;例如,在 ~/.sbt/build.sbt 中,您可以定义影响所有项目的设置。
    • 插件注入的设置,请参阅接下来的使用插件。
    • 来自项目中 .sbt 文件的设置。
    • 构建定义项目(即项目内的项目)添加了来自全局插件 (~/.sbt/plugins) 的设置。使用插件 对此进行了更多解释。后面的设置会覆盖前面的设置。整个 设置列表构成构建定义。

    因此您可以覆盖您的全局 build.sbt 以使用

    指定存储库路径
    "Local Maven" at Path.userHome.asFile.toURI.toURL + ".m2/repository"
    

    【讨论】:

    • 感谢您耐心了解问题并提供解决方案。 @khmarbaise 的答案可能适用于用例,但不适用于我的用例。随着时间的推移,你的本地 maven repo 变得越来越大,10GB 并且很多文件都过时了。我会清除它们。但现在我需要刷新所有项目并重新下载文件。这也是我想为每个项目组保留单独工件的众多原因之一。
    【解决方案3】:

    您应该能够使用配置对象来执行此操作。

    例如在 .sbt 文件中:

    val MyConfig = Configurations.config("my-config").extend(Compile)
    
    (resolvers in MyConfig) := Seq(???)
    

    然后当你使用 sbt shell 时你可以调用

    my-config/compile
    

    它会使用您为该范围声明的设置。 然后,您可以根据需要声明任意数量的配置。

    【讨论】:

      【解决方案4】:

      我认为您正在寻找将工件发布到您公司的内部 JFrog 存储库。

      相关的 JFrog 文档可以在这里找到 - https://www.jfrog.com/confluence/display/RTF/SBT+Repositories#SBTRepositories-DeployingArtifacts

      【讨论】:

      • 没有。我只想要单独的工件目录。例如对于不同的项目,我有不同的 .m2 和 .gradle 目录。我为公司的工作使用内部存储库,为我自己的代码使用 Maven 中心。
      【解决方案5】:

      我正在查看 sbt 命令行帮助,发现我可以使用 -ivy 选项设置本地 ivy 存储库的路径。

      【讨论】:

        猜你喜欢
        • 2020-06-15
        • 1970-01-01
        • 2016-09-24
        • 1970-01-01
        • 2018-07-13
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        • 2021-04-10
        相关资源
        最近更新 更多