代码之家  ›  专栏  ›  技术社区  ›  Max A.

如何在SBT项目中处理供应商依赖关系?

  •  -2
  • Max A.  · 技术社区  · 6 年前

    Go以源代码的形式管理依赖关系,任何明智的工程师都会认为这很可怕,直到她发现将自己的依赖关系存储在 vendor/ 在源代码管理下的目录是一张“免去牢狱之灾”的卡片,适用于依赖解析变得过于复杂而不利于自身的情况,或者依赖于脆弱的第三方资源(如网络)的情况。

    Go的CLI工具的最新版本附带了一个名为 go mod vendor 供应商/ 项目中的目录,可以随后签入源代码管理。抛开关于以这种方式积极地和先发制人地缓存依赖项的优点的讨论不谈,我想郑重声明,这个命令 非常方便 .

    SBT因将依赖项下载到 ~/.ivy2 ,这更像是一个由用户的所有项目共享的免费缓存,而不仅仅是一个项目。里面有一个较小的缓存 ~/.sbt ,它被SBT本身用作Humpty-Dumpty/Mr-Potato-Head-scratch空间。将创建两个目录;如果它们不存在,则会自动填充,但这两个对象都不打算由用户显式管理。两者都是SBT和/或Ivy的内部实现细节,不应该被“除非你知道你在做什么”搞砸。

    我想要的(现在我要的是东西)是 sbt vendor unmanaged classpath 与我的项目的所有依赖关系。如果它还可以将运行SBT本身所需的所有内容下载到同一个目录中,那就太好了。

    有没有一个SBT插件或一些神秘的咒语序列,可以用来完成我所寻求的?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Max A.    6 年前

    #!/bin/bash
    
    root="$(readlink -f "$(dirname "$0")")"
    sbt="$root/.sbt-launcher"
    
    if [ ! -x "$sbt" ]; then
      echo "$sbt does not exist or is not executable"
      exit 1
    fi
    
    exec "$sbt" \
      -ivy            "$root/.ivy2"          \
      -sbt-dir        "$root/.sbt"           \
      -sbt-boot       "$root/.sbt/boot"      \
      -sbt-launch-dir "$root/.sbt/launchers" \
      $@
    

    让我们很快把它打开。首先,shell脚本是真正的SBT启动程序的包装器,它位于同一目录中并命名为 .sbt-launcher http://git.io/sbt .

    • -ivy 指定常春藤缓存的自定义位置。
    • -sbt-dir -sbt-boot ,和 -sbt-launch-dir ~/.sbt 目录作为一个垃圾场的SBT罐和其他东西。

    我把这个shell脚本保存为 sbt .sbt发射器 http://git.io/sbt .ivy2 .sbt