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

38

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

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

对于Maven,有每个用户的settings.xml文件可用于配置本地存储库。

我已经阅读了问题如何覆盖Ivy缓存的位置?以及它的答案,但似乎它只描述了如何基于每个项目配置该设置。

如果没有其他选择,我会选择每个项目的设置,但我没有让提到的问题的答案起作用。一些更多的细节将不胜感激,例如将ivysettings.xml放在哪里。我把它放在项目的根目录中,但它没有发挥作用。

7个回答

50

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/目录中。当然,你也可以将它们放在不同的目录中。


谢谢 - 这对我在sbt 0.7.7上起作用,而另一个解决方案是针对sbt 0.9及以上的特定版本。 - Daniel Martin
5
我知道这是一篇旧帖子,但这些信息非常好。如果有人需要,你可以将上面的信息添加到位于SBT/Conf文件夹底部的“sbconfig.txt”文件中:-Dsbt.ivy.home=j:/tmp/.ivy2/-Divy.home=j:/tmp/.ivy2/ - LaloInDublin
2
@sbtconfig.txt(仅限Windows)是一个配置文件,列出了JVM选项,并由sbt.bat使用。 sbtopts由sbt shell脚本使用。 - Epicurist
关于Intellij的设置,请参考此链接 "teliatko/ivy-home-sbt-idea.md" https://gist.github.com/teliatko/127f4ec7e5362f1f5cc68ade9f1221ac - SemanticBeeng
1
最好使用IntelliJ的UI。设置>构建、执行>构建工具>sbt。然后在VM参数框中添加-Dsbt.ivy.home=/tmp/.ivy2/ -Divy.home=/tmp/.ivy2/ - Epicurist

32
你可以简单地向你的 sbt 启动 shell 脚本添加一个环境变量:
java -Dsbt.ivy.home=/tmp/.ivy2/ ...

请参阅官方文档中的库管理


这是个好主意!我会尝试一下,如果有效的话,你的答案就是解决方案。 - Ruediger Keller
感谢您更新有关sbt 0.9/0.10的答案。当我看到这个答案时,我正准备自己提供这样的答案。 - Ruediger Keller
8
“sbt launch shell script”在哪里? - weima

8

如果你还没有使用,建议使用sbt-extras

然后,只需传递一个标志即可:

sbt -ivy /path/to/.ivy2

对我来说似乎被简单地忽略了 - 运行 sbt -ivy ~/.ivy2 App/run - 仍然得到 [error] (PlayCommons / update) java.io.IOException: Permission denied, file: /root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.8.jar - AxelTheGerman

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)

3

ivy文件的位置

通常我会将 ivy.xmlivysettings.xml 文件与我的构建文件放在一起,如下所示:

build.xml
ivy.xml
ivysettings.xml

常见的Ivy任务resolveretrieve应该都能找到这两个文件。

例如:

<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
谢谢你的回答,但我觉得你假设我同时使用了Ant和Ivy。也许从我的问题中并不清楚,但我使用的是SBT作为构建工具,而不是Ant。我会相应地编辑我的问题。 - Ruediger Keller

2
sbt -ivy /tmp/.ivy2 compile

参考文献:sbt 命令手册

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


似乎对我来说被简单地忽略了 - 运行 sbt -ivy ~/.ivy2 App/run - 仍然出现 [error] (PlayCommons / update) java.io.IOException: Permission denied, file: /root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.8.jar - AxelTheGerman

2

想要在SBT启动过程中编辑缓存位置,请参阅官方文档中的Sbt Launcher Configuration

基本上,要使其全局生效,你需要:

  • 将名为sbt.boot.properties的配置文件放置在系统范围内可访问的某个地方(默认配置文件在上面的链接中列出)。
  • 使用附加的系统属性sbt.boot.properties调用launcher,并将其设置为指向您的配置文件。
  • [ivy]部分中的cache-directory条目设置为您的ivy缓存位置。

不幸的是,这种配置似乎不能传递到正常的SBT使用中。


我曾经多次查看了SBT文档,但从未遇到过这个。这似乎是我问题的正确答案。因此,在测试后,我将标记它为正确答案。 - Ruediger Keller
我也花了很长时间才找到这个,要注意它并不会完全移动你的Ivy home,只是缓存目录。在将自己的代理(如Artifactory或Nexus)添加到引导解析器链中的情况下,它也非常有用。 - Joachim Hofer
实际上,这个属性文件似乎只在 SBT 的引导过程中起作用。 :( - 所以,看来我们又回到了 user.home hack... - Joachim Hofer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接