如何为每个用户或系统范围配置 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.xml 和 ivysettings.xml 文件放在构建文件旁边,如下所示:
build.xml
ivy.xml
ivysettings.xml
ivy 任务 resolve 和 retrieve 应该找到这两个文件。
例如:
<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