我使用SBT作为构建Scala项目的构建工具。
我的问题是,我无法配置SBT将依赖项下载到我的用户主目录。因此,我正在寻找一个每用户甚至更好的系统范围设置,告诉SBT将Ivy缓存目录放在其他地方。
使用maven,可以使用每用户settings.xml配置本地存储库。
我已阅读问题How to override the location of Ivy’s Cache?及其答案,但似乎只介绍了如何根据每个项目配置设置。
如果没有其他选择,我会选择每个项目设置,但我没有从上述问题得到答案。更多细节将是最受欢迎的,例如放置ivysettings.xml的位置。我将它放入项目的根目录,但它不起作用。
答案 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)
答案 2 :(得分:8)
答案 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)