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

Posted

技术标签:

【中文标题】如何为每个用户或系统范围配置 Ivy 缓存目录?【英文标题】:How to configure Ivy cache directory per-user or system-wide? 【发布时间】:2011-03-09 17:49:33 【问题描述】:

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

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

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

我已阅读问题How to override the location of Ivy’s Cache? 及其答案,但它似乎只描述了如何在每个项目的基础上配置设置。

如果没有其他选择,我会选择按项目设置,但我没有从提到的问题中得到答案。欢迎提供更多详细信息,例如放置 ivysettings.xml 的位置。我把它放到项目的根目录下,还是不行。

【问题讨论】:

【参考方案1】:

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 和更高版本。 我知道这是一篇旧帖子,但此信息非常好,如果有人需要 - 您可以将上述信息添加到位于底部文件夹 SBT/Conf 中的文件“sbtconfig.txt”中: -Dsbt.ivy.home=j:/tmp/.ivy2/ -Divy.home=j:/tmp/.ivy2/ @LaloInDublin "sbtconfig.txt"(仅限 Windows)是一个列出 JVM 选项的配置文件,由 sbt.bat 使用。 sbtopts 被 sbt shell 脚本使用。 对于 Intellij 设置,请参阅此“teliatko/ivy-home-sbt-idea.md”gist.github.com/teliatko/127f4ec7e5362f1f5cc68ade9f1221ac 更好地使用 IntelliJ 的 UI。设置>构建,执行>构建工具> sbt。并在VM参数框中添加-Dsbt.ivy.home=/tmp/.ivy2/ -Divy.home=/tmp/.ivy2/【参考方案2】:

您可以简单地将环境变量添加到您的 sbt 启动 shell 脚本中:

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

参见官方文档中的Library Management。

【讨论】:

这是个好主意!我会尝试一下,如果有效,您的答案就是解决方案。 感谢您更新 sbt 0.9/0.10 的答案。当我看到这个时,我正准备自己提供这样的答案。 “sbt 启动 shell 脚本”在哪里?【参考方案3】:

如果你还没有这样做,你应该使用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【参考方案4】:

常春藤文件的位置

我通常将 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

【讨论】:

感谢您的回答,但在我看来,您是在假设我将 Ant 与 Ivy 一起使用。也许我的问题并不清楚,但我使用 SBT 作为我的构建工具,而不是 Ant。我将相应地编辑我的问题。【参考方案5】:

您可以使用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)

【讨论】:

【参考方案6】:

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

基本上,要让它在系统范围内工作,您必须:

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

不幸的是,此配置似乎无法延续到正常的 SBT 使用。

【讨论】:

我以为我多次查看 SBT 文档,但我从来没有偶然发现这一点。这看起来像是对我的问题的正确答案。因此,经过测试,我会将其标记为正确答案。 我也花了很长时间才找到这个...... - 请注意,它不会完全移动您的常春藤家,只是缓存目录。在将您自己的代理(如 Artifactory 或 Nexus)添加到引导解析器链中时,它也非常有用。 其实这个属性文件似乎只在SBT的启动过程中起作用。 :( - 所以,看起来我们又回到了 user.home hack...【参考方案7】:
sbt -ivy /tmp/.ivy2 compile

参考:man sbt

选项: -ivy 路径:本地 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

以上是关于如何为每个用户或系统范围配置 Ivy 缓存目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何为项目/lib 中的本地 jar 创建 Ivy 依赖项?

springboot2.0中使用@cacheable时如何为每个redis缓存配置不同的ttl

如何为每个模型存储/关联用户特定的数据(状态?)

[至逝去的一年]修改IntelliJ IDEA修改系统缓存目录,修改sbt的.sbt和.ivy2

如何为具有分离数据源的 2 个反应组件更新 relayjs 缓存

如何为多个用户配置 phpMyAdmin - 每个用户只能访问他们的数据库