如何为每个用户或系统范围配置常春藤缓存目录?

时间:2010-06-29 16:50:06

标签: scala sbt ivy

我使用SBT作为构建Scala项目的构建工具。

我的问题是,我无法配置SBT将依赖项下载到我的用户主目录。因此,我正在寻找一个每用户甚至更好的系统范围设置,告诉SBT将Ivy缓存目录放在其他地方。

使用maven,可以使用每用户settings.xml配置本地存储库。

我已阅读问题How to override the location of Ivy’s Cache?及其答案,但似乎只介绍了如何根据每个项目配置设置。

如果没有其他选择,我会选择每个项目设置,但我没有从上述问题得到答案。更多细节将是最受欢迎的,例如放置ivysettings.xml的位置。我将它放入项目的根目录,但它不起作用。

7 个答案:

答案 0 :(得分:42)

sbt.ivy.home属性只是解决方案的一半。它控制sbt启动程序下载sbt本身的位置(以及scala编译器和库等相关依赖项)正如Joachim Hofer所述,它对下载项目声明的依赖项的位置没有影响。

要更改 位置,您必须设置ivy.home属性。因此,为了增加Joachim的第一个解决方案,您需要设置两个系统属性:

java -Dsbt.ivy.home=/tmp/.ivy2/ -Divy.home=/tmp/.ivy2/ -jar `dirname $0`/sbt-launch.jar "$@"

使用这些属性,启动程序会将项目和sbt的依赖项下载到/tmp/.ivy2/目录。当然,您也可以将它们放在不同的目录中。

答案 1 :(得分:30)

您只需将环境变量添加到sbt launch shell脚本:

java -Dsbt.ivy.home=/tmp/.ivy2/ ...

请参阅官方文档中的Library Management

答案 2 :(得分:8)

如果您还没有,请使用sbt-extras

然后,它只是你传递它的旗帜:

sbt -ivy /path/to/.ivy2

答案 3 :(得分:3)

常春藤文件的位置

我通常将 ivy.xml ivysettings.xml 文件放在构建文件旁边,如下所示:

build.xml
ivy.xml
ivysettings.xml

常春藤任务解决检索应该找到这两个文件。

例如:

<target name="init" description="--> retrieve dependencies with ivy">
    <ivy:retrieve pattern="lib/[conf]/[artifact].[ext]"/>
</target>

奇怪,它不适合你。

用户特定设置

您可以通过多种方式模拟maven设置文件

1)在项目 ivysettings.xml

中包含指令
<ivysettings>
    <include file="${user.home}/.ivy2/my-ivysettings.xml"/>
</ivysettings>

2)从构建文件

设置位置
<target name="init" description="--> retrieve dependencies with ivy">
    <ivy:settings file="${user.home}/.ivy2/my-ivysettings.xml" />
    <ivy:retrieve pattern="lib/[conf]/[artifact].[ext]"/>
</target>

3)我从未尝试过这个,但我认为您可以使用ANT属性覆盖默认位置

ant -Divy.settings.file=$HOME/.ivy2/my-ivysettings.xml

答案 4 :(得分:3)

您可以使用Path.userHome.absolutePath检索主目录,如下所示:

resolvers += Resolver.file("Local", file( Path.userHome.absolutePath + "/.ivy2/local"))(Resolver.ivyStylePatterns)

我想您也可以使用System.getenv检索环境变量并以相同的方式连接,如下所示:

resolvers += Resolver.file("Local", file( System.getenv("IVY_HOME") + "/whatever/it/is"))(Resolver.ivyStylePatterns)

答案 5 :(得分:2)

要在SBT引导期间编辑缓存位置,请参阅官方文档中的Sbt Launcher Configuration

基本上,为了让它在全系统上运行,您必须:

  • 将名为sbt.boot.properties的配置文件放在可在系统范围内访问的位置(默认链接在上面的链接中列出)。
  • 调用启动器,并将其他系统属性sbt.boot.properties设置为指向您的配置文件。
  • cache-directory条目(在[ivy]部分中)设置为常春藤缓存的位置。

不幸的是,这种配置似乎没有延续到正常的SBT使用。

答案 6 :(得分:2)

sbt -ivy /tmp/.ivy2 compile

参考: man sbt

  

选项:   -ivy path:本地Ivy存储库的路径(默认值:〜/ .ivy2)