请分享您的想法,参与2024年Clojure状态调查!

欢迎!请查阅关于页面,了解关于此处的更多信息。

+2
Clojure

在构建依赖tools.build的工具时,我期望可以构建一次,这将获取所有必需的依赖项,然后在没有网络访问的情况下再次构建。

特别是,我希望能单独获取所有这些依赖项,然后从nix构建内部进行构建。

这在clojure 1.10.3.855中工作,但在1.10.3.933中出现问题,我不确定原因。

您可以在https://github.com/radvendii/clojure-tools.build-test找到可复制的存储库,readme中包含说明。

1 答案

0

使用Clojure CLI 1.10.3.1087(最新版),我无法重现此问题。如果按照存储库中的说明构建,然后切断网络访问,我可以成功连续重建uberjar。

我注意到933将安装器更改为处理内置工具.edn工具的安装,nix构建可能需要相应地进行更改?我不认为自那时以来有任何其他安装器更改。
我们还不确定为什么有时繁殖失败,但我们已经对这个复制案例进行了一些实验,并注意到以下情况
当我们从deps.edn中的一个依赖项中删除:tag项目时,我们可以成功离线构建。

我们对代码的理解是
- 如果存在该项目,t.d.a会调用gitlibs/tags。(https://github.com/clojure/tools.deps.alpha/blob/master/src/main/clojure/clojure/tools/deps/alpha/extensions/git.clj#L64
- 这个实现的调用git fetch是无条件的。(https://github.com/clojure/tools.gitlibs/blob/master/src/main/clojure/clojure/tools/gitlibs/impl.clj#L179
- 这反过来又总是会访问网络。

目前,我们可以通过省略此标志来解决这个问题。不过,问题仍然没有在Mac OS上失败复现,这有点令人费解。这可能与操作系统中的git安装有关吗?
仅供参考,您是如何尝试复现这个问题的?据我所知,MacOS没有unshare,所以我推测您有其他方法来隔离网络访问。
我刚刚关闭了我自己的wifi来测试。它没有失败的原因是因为classpath信息被缓存在.cpcache中。使用-Sforce既足够让它复现。我已经在https://clojure.atlassian.net/browse/TDEPS-223提交了一个问题。
请注意:自从我们从直接依赖中删除了这些标签后,我们的情况已经大大改善。幸运的是,我们目前在传递依赖中似乎并没有这种情况。但这种情况完全可能发生,因此确实非常欢迎离线模式:)
...