如何强制 sbt 获取它需要的所有东西一次?

How to force sbt to fetch everything it needs once?

我在一个非常注重安全的地方从事一个项目,无法通过代理访问 SBT 通常需要的所有在线存储库。我们想一次获取我们需要的依赖项和传递依赖项。

如何强制 sbt 一次获取项目所需的所有依赖项,然后从那里开始,只能离线工作?我试过在家里这样做。然后我复制了以下所有内容:

~/.ivy2/cache
~/.ivy2/local
$ACTIVATOR_HOME/repository

但仍然 SBT 即使在使用 sbt "set offline := true" run 执行时也会尝试在线获取所有内容……这很痛苦。然后终于崩溃并抱怨它没有找到一些依赖性。

更新:我注意到另一个问题来源,但还不能断定它是 OP 损坏构建问题的罪魁祸首。我从 Linux(Ubuntu 框)构建并获取项目的依赖项,然后将所有文件复制到企业 Windows 7 Pro 环境。我发现 ~/.ivy2/cache 下的许多 属性 文件引用了 Ubuntu 中激活器存储库目录的绝对路径,这在 Windows 环境中当然是不正确的,例如

#ivy cached data file for ch.qos.logback#logback-classic;1.1.3
#Fri Mar 10 08:39:37 CET 2017
artifact\:ivy\#ivy.original\#xml\#-1844423371.location=/opt/dev/activator/1.3.12/repository/ch.qos.logback/logback-classic/1.1.3/ivys/ivy.xml
artifact\:ivy\#ivy\#xml\#1016118566.is-local=true
artifact\:ivy\#ivy\#xml\#1016118566.location=/opt/dev/activator/1.3.12/repository/ch.qos.logback/logback-classic/1.1.3/ivys/ivy.xml
artifact\:ivy\#ivy.original\#xml\#-1844423371.is-local=true
artifact\:ivy\#ivy\#xml\#1016118566.exists=true
artifact\:logback-classic\#jar\#jar\#804750561.is-local=true
artifact\:logback-classic\#jar\#jar\#804750561.location=/opt/dev/activator/1.3.12/repository/ch.qos.logback/logback-classic/1.1.3/jars/logback-classic.jar
artifact\:ivy\#ivy.original\#xml\#-1844423371.exists=true
artifact\:logback-classic\#jar\#jar\#804750561.exists=true

所以我去做了查找和替换,但构建仍然无法正常工作。将数千个 属性 文件硬编码到激活器位置的绝对路径看起来不是一个绝妙的主意。我宁愿他们为此使用环境变量。

也许你可以试试 coursier? 不仅如此

better offline mode - one can safely work with snapshot dependencies if these are in cache (SBT tends to try and fail if it cannot check for updates)

但由于并行工件下载,它也比 Ivy 快得多。这个项目虽然年轻但很有前途。