如何强制 sbt 一次获取它需要的所有东西?
Posted
技术标签:
【中文标题】如何强制 sbt 一次获取它需要的所有东西?【英文标题】:How to force sbt to fetch everything it needs once? 【发布时间】:2017-08-01 02:08:45 【问题描述】:我在一个非常注重安全的地方从事一个项目,无法通过代理访问 SBT 通常需要的所有在线存储库。我们想一次性获取我们需要的依赖和传递依赖。
如何强制 sbt 一次性获取项目所需的所有依赖项,并且只能离线工作?我已经尝试在家中做到这一点。然后我复制了以下所有内容:
~/.ivy2/cache
~/.ivy2/local
$ACTIVATOR_HOME/repository
但即使使用sbt "set offline := true" run
执行,SBT
仍然会尝试在线获取所有内容……很痛苦。然后终于打破并抱怨它没有找到一些依赖关系。
更新:我注意到另一个问题来源,但还不能断定它是 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
所以我去查找并替换,但构建仍然无法正常工作。将数千个属性文件硬编码到激活器位置的绝对路径似乎不是一个绝妙的主意。我宁愿他们为此使用环境变量。
【问题讨论】:
是否有任何依赖项标记为SNAPSHOT
? ~/.ivy2/cache
的全部意义在于避免上网。这让我觉得你正在做一些事情来颠覆这种行为。
@wheaties,谢谢你的帮助!不,不SNAPSHOT
s 至少不是直接的,它在发布版本上失败,而原始 PC 可以工作。
我建议,如果您将任何内容从 Linux 机器复制并粘贴到 Windows 机器,请运行以下命令:sbt clean
。是的,我知道,这就是您要避免的,但请记住,不应假定文件夹结构和设置在整个操作系统中都是静态的。
【参考方案1】:
也许你可以试试coursier? 不只是它提供
更好的离线模式 - 如果快照依赖项在缓存中,则可以安全地使用它们(如果无法检查更新,SBT 往往会尝试并失败)
但由于并行工件下载,它也比 Ivy 快得多。这个项目很年轻,但很有前景。
【讨论】:
以上是关于如何强制 sbt 一次获取它需要的所有东西?的主要内容,如果未能解决你的问题,请参考以下文章
更改后如何强制 IntelliJ IDEA 从 build.sbt 重新加载依赖项?