使用SBT和SNAPSHOT依赖项进行离线工作

21

我从未能够在任何项目中离线使用SBT。现在我正在搬家,我的wardrobe-server托管的nexus处于离线状态。

所以运行以下命令:

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"),

但我在我的Ivy缓存中确实有这个依赖项:

$ 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/

这难道不足够了吗?对我来说,整个"offline := true"设置从未有过任何区别。依赖关系似乎在之前就已经发生了。

我现在真的需要让它工作起来。我遇到了这个问题多年,但现在我处于完全无法工作的情况。

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

我阅读到:

当 offline:= true时,远程快照将不会被解析更新,即使显式请求更新也是如此。这应该有效地支持在没有连接到远程存储库的情况下工作。如果有反例请提供可以复现的示例。显然,在转为离线模式之前必须成功运行更新。

我可能没有正确理解,但是它是否意味着我不应该遇到我目前的问题?

我使用相同的方法时也遇到了同样的问题:

> sbt "skip in update := true" run

使用sbt 0.13.5

编辑:

在将我的存储库重新上线、解决所有依赖关系并将我的Wi-Fi设置为离线后,我可以退出sbt然后运行它。但是,只需要运行;reload ;clean ;compile,我就再次遇到问题了。如果退出,我甚至无法启动sbt。项目的依赖关系解析发生在我尝试使用dependency-tree等工具分析依赖关系图之前。即使不在线,如果尝试了解失败的传递性依赖项的来源,这也会非常令人烦​​恼。


1
成功在线更新后,您离线时是否仍然遇到问题?即在线上,所有快照都会被更新(我认为每天一次)。但在离线状态下,它们不会被更新,但我认为这是因为之前已经成功解决了。更改Scala、sbt版本可能会使sbt重新设置“已解决”标志。 - nafg
在我的repo再次上线、解决所有依赖关系并将wifi设置为离线后,我至少可以退出sbt并再次运行它。然而,只需运行;reload ;clean ;compile,我就又遇到了麻烦。如果我退出,甚至无法再次启动sbt。 - Viktor Hedefalk
1
这可能与您相关:https://github.com/sbt/sbt/wiki/User-Stories:--Offline-mode-and-Dependency-Locking - jsuereth
1
@jsuereth 谢谢,非常相关 :) 那个功能有时间表吗? - Viktor Hedefalk
+1 离线模式。我非常惊讶这还没有得到支持。所以如果网络出问题,依赖于任何快照和感叹号,今天就不能开发了吗? - fommil
显示剩余3条评论
4个回答

8
这个方法看起来像是一个可怕的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模式。将本地缓存添加到任何其他仓库的下面,以便它们首先尝试。

1
我真的不太明白那个!!!难道不应该是默认行为在访问远程仓库之前先使用本地缓存吗?我有同样的问题。当我离线时,有一些依赖项无法解决。其他所有依赖项都可以正常工作。但是如果我不在线,这两个依赖项就无法解决。 - MaatDeamon
你是怎么知道要在哪个文件里写什么的? - Juh_
几乎成功了,但最终由于一些Hadoop依赖项而失败了。似乎缓存的ivy文件无效:一些“元素“e:sbtTransformHash”的前缀“e”未绑定”错误,我认为与该问题有关。 - Juh_
1
我需要做的是先删除缓存中的一些*.xml.original文件,然后只需在出现的文件中删除<e:sbtTransformHash>标签。 然后它最终对我起作用了。 此外,我将repo配置写入“offline-repositories”文件中,并使用“sbt -Dsbt.override.build.repos=true -Dsbt.repository.config=./offline-repositories”启动sbt,这样当我在线时就不会发生什么问题。 - Boris Stumm
这个能否通用化,使得路径对于任何用户都能解析? - ferk86
为什么不使用${user.home}来解析初始路径? - ramsvidor

2

我也不能在一行代码中使用它。

但是如果我启动sbt,然后在sbt中使用set offline := true,它就可以正常工作。


2

1

从sbt 0.13.7开始,当您使用依赖缓存时,可以离线工作

简而言之:

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

然后,如果您不更改依赖项,则sbt将始终使用缓存的依赖项,无需网络(我刚试过)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接