使用 SBT 和 SNAPSHOT 依赖项脱机工作

Posted

技术标签:

【中文标题】使用 SBT 和 SNAPSHOT 依赖项脱机工作【英文标题】:Working offline with SBT and SNAPSHOT dependencies 【发布时间】:2014-08-15 05:27:54 【问题描述】:

我从来没有能够在我的任何项目中使用 SBT 离线工作。现在我正在搬家,我的衣橱服务器托管连接已离线。

所以说:

sbt "set offline := true" run

我得到了其他缺失的部门:

[error] unresolved dependency: se.hedefalk#lift-utils_3.0_2.10;0.2-SNAPSHOT: not found

对于声明为的依赖项:

"se.hedefalk"       %% ("lift-utils_"+liftEdition) % ("0.2-SNAPSHOT"),

但我的常春藤缓存中确实存在依赖项:

$ ll ~/.ivy2/cache/se.hedefalk/lift-utils_3.0_2.10/
total 32
drwxr-xr-x  8 viktor  staff   272B Mar 14 11:36 ./
drwxr-xr-x  5 viktor  staff   170B Mar  8 10:38 ../
drwxr-xr-x  3 viktor  staff   102B Mar 14 11:36 docs/
-rw-r--r--  1 viktor  staff   4.5K Mar  4 15:54 ivy-0.2-SNAPSHOT.xml
-rw-r--r--  1 viktor  staff   4.0K Mar  4 15:54 ivy-0.2-SNAPSHOT.xml.original
-rw-r--r--  1 viktor  staff   1.8K Mar 14 11:36 ivydata-0.2-SNAPSHOT.properties
drwxr-xr-x  3 viktor  staff   102B Mar  8 10:38 jars/
drwxr-xr-x  3 viktor  staff   102B Mar 14 11:36 srcs/

这还不够吗?整套“离线:= true”对我来说从来没有任何不同。依赖解决似乎以前发生过。

我现在真的需要让它工作。多年来我一直遇到这个问题,但现在我处于根本无法工作的境地。

这里: http://www.scala-sbt.org/0.13.5/docs/Detailed-Topics/Dependency-Management-Flow.html

我读过

当离线 := true 时,远程 SNAPSHOT 不会被 解决方案,甚至是明确要求的更新。这应该 有效地支持在没有远程连接的情况下工作 存储库。以其他方式证明的可重复示例是 赞赏。显然,更新之前必须已经成功运行 离线。

我可能没有正确理解这一点,但这是说我不应该遇到我遇到的问题吗?

我有同样的问题使用:

> sbt "skip in update := true" run

使用 sbt 0.13.5

编辑:

在我的 repo 再次联机后,解决所有 deps,然后将我的 wifi 设置为脱机,我可以退出 sbt 然后运行它。但是,只需运行 ;reload ;clean ;compile ,我就又被搞砸了。如果我退出,我什至根本无法启动 sbt。项目的依赖关系解析发生在我可以尝试使用依赖树或类似文件分析依赖图之前。即使不是在线的,如果说试图了解失败的传递依赖来自何处,这也是非常令人恼火的。

【问题讨论】:

您是从头开始离线创建项目,还是尝试运行之前已更新的现有项目? 现有项目。但我最近开始使用JDK8。将 scala 版本从 2.10.2 更改为 2.10.4,试图修复与此相关的一些字节码问题,并在此版本中将 sbt 0.13.1 更改为 0.13.5。改回两者都无济于事。 在线更新成功后,离线还有问题吗? IE。在线所有快照都会更新(我认为每天一次)。离线他们不是,但我认为如果它以前被认为已成功解决。可以这么说,更改 scala、sbt 版本可能会使 sbt 重置“已解决”标志。 这可能是相关的:github.com/sbt/sbt/wiki/… @jsuereth 谢谢,是的,非常相关 :) 关于该功能的任何时间范围? 【参考方案1】:

这似乎是一个可怕的 hack,但是您可以将您的 ivy 缓存指定为 ivy 存储库,这样一旦您的依赖项被下载,它们就可以从缓存中解析。

例如,您的 ~/.sbt/repositories 可能如下所示:

[repositories]
  local
  maven-central
  cache: file://$user.home/.ivy2/cache, [organisation]/[module]/ivy-[revision].xml, [organisation]/[module]/[type]s/[module]-[revision].[type]

注意:我必须明确设置 ivy 和 artifact 模式。在任何其他 repos 下方添加本地缓存,以便首先尝试它们。

【讨论】:

我不太明白!!!在访问远程存储库之前,不应该是使用本地缓存的默认行为吗?我有同样的问题。当我离线时,我几乎没有无法解决的依赖关系。所有 thttp://***.com/questions/25348793/sbt-when-no-internet-connection,其余的都可以正常工作。但是,如果我不在线,我有这两个无法解决的依赖项。 你是怎么知道在哪个文件里写什么的? :-\ 它几乎可以工作,但最终由于几个 hadoop 部门而失败。似乎缓存的常春藤文件无效:我认为与that issue有关的一些“The prefix "e" for element "e:sbtTransformHash" is not bound”错误 我要做的是首先删除缓存中的一些 *.xml.original 文件,然后在它们出现的文件中删除 标签。然后它终于对我有用。此外,我在“offline-repositories”文件中编写了 repo 配置,并以“sbt -Dsbt.override.build.repos=true -Dsbt.repository.config=./offline-repositories”启动 sbt,这样没有坏事当我在线时发生。 能否将其设为通用,以便为任何用户解析路径?【参考方案2】:

我也不能在单行中使用它。

但是如果我开始 sbt 然后在 sbt 我使用 set offline := true 它运行良好。

【讨论】:

【参考方案3】:

这里有一个 wiki 页面:https://github.com/sbt/sbt/wiki/User-Stories:--Offline-mode-and-Dependency-Locking,于 5 月编辑,表示 SBT 的离线概念无法正常工作。这可能是即使设置了offline 设置,您的构建仍会继续尝试解决对远程存储库的依赖关系的原因之一。

【讨论】:

【参考方案4】:

从sbt 0.13.7开始,使用dependency cache时可以离线工作

简而言之:

在您的项目设置(以及所有子项目设置)中添加updateOptions := updateOptions.value.withCachedResolution(true) 在线运行一次sbt clean compile。它像以前一样运行,检查所有分辨率。但也可以在本地创建和存储解析的依赖图(在~/.sbt/0.13/dependency 中)。

那么,如果你不改变你的依赖,sbt 会一直使用缓存的依赖并且不需要网络(我刚试过)

【讨论】:

以上是关于使用 SBT 和 SNAPSHOT 依赖项脱机工作的主要内容,如果未能解决你的问题,请参考以下文章

Play 2.0 和 SNAPSHOT 依赖项

使用 SBT 和 Scala IDE 添加和删除依赖项

Android:如何让gradle让特定的依赖关系脱机而其他人在线?

Sbt Plugin 添加依赖到 project/build.sbt

如何在 sbt 项目中使用 sbt 插件作为库依赖项?

有条件地使用 sbt 和通用插件包含提供的范围依赖项