请在 2024 年 Clojure 状态调查中分享您的想法!

欢迎!请参阅 关于 页面以了解更多关于此的工作方式。

+2
tools.deps

我有一个离线 Clojure 项目的用例。我想包含一个打包的依赖项(在这种情况下是一个经过修改的 Oz 版本,以离线方式工作,它不会获取 JS 依赖项)。结果是包含了 Oz 所需所有内容的 uberjar。我想通过 clj CLI 工具对其进行操作。我遵循了指南中的说明,并在 uberjar 中与最小的 deps.edn 完全位于同一位置

{:deps {metasoarous/oz {:local/root "./oz.jar"}}}

在我想象中,这应该与调用
java -cp oz.jar clojure.main

不更改 deps.edn 的任何内容,然后启动 clj 将尝试解决依赖(例如 clojurescript),这我不希望(事实上,由于网络设置,它们将失败)。

是否有规定的方式只将 uberjar 作为哑本地依赖项来处理,而不激活更高阶的依赖项解析机制?我想要利用 deps.edn 中的选项(例如设置源路径等),只是预先在 uber.jar 中加载大量库(假设在限制环境中所有所需的依赖项)。

另一种选项(我想)是将它安装到本地的 .m2 并将其视为 Maven 坐标,这应该(希望)防止 clj 尝试在线嗅探依赖项。
我希望能使本地 jar 方法工作。

1 个回答

+1

目前clj没有“离线”模式,并且会检查jar依赖,寻找jar内部的pom文件,并基于此检索依赖。我想如果你制作了一个没有内部pom文件的uberjar,可能就足够了。

你为什么不直接使用java -cp oz.jar clojure.main呢?在我看来的这个场景中,clj在上面提供不了额外的价值。

我原本希望理论价值是类路径管理、脚本等。管理源路径、利用别名等。基本上是最少的路径和(非Maven)依赖设置(如本地文件依赖、git依赖等)。我将回退到手动路径和依赖管理+脚本。
如果你使用uberjar,那么这些功能都不适用吗?
uberjar之外的部件确实适用。文件依赖、git相关内容、别名。而且不需要任何互联网连接,可能是通过相对独立的机器上的本地解析来实现链接。uberjar简化了把oz的依赖运送到本地机器的过程。我以前使用lein offline做这事,还可以(还是有点笨拙)。当时的clj看起来像是一个更好的解决方案,而不是通过脚本和不同的加载文件网页将类路径生成、文件依赖、本地jar和可选加载组合起来。我当时想工具.deps可以简化这些事情。
by
将事物组合到uberjar后,tools.deps再也无法对它们做任何事情——它看起来就像一个巨大的工件。版本选择不起作用,类路径上的组合不起作用,等等。别名用于修改依赖解析或类路径构建,但这些都被uberjar破坏。Uberjar的整个目的是没有其他东西。Uberjar天生与所有依赖解析和类路径工具相矛盾,因此只能在构建最终部署应用程序jar时使用(永远不要放入Maven)。
by
所以替代方案(我用lein做过的)是维护一个本地.m2,预填所有依赖关系(比如说从原始机器上),并将其拉到隔离的盒子上。然后让正常的依赖解析机制启动,而不仅仅是通过一个不透明的uberjar包含一个庞大的已解析依赖关系集。这只是在气球中移动空气——与其封装一个uberjar,不如封装一个单独的.m2存档,并遵守tools.deps的期望。或者,将uberjar本身作为本地工件安装到.m2中,让deps指向它(可能不那么令人愉快)。只要我保持在本地.m2中现有依赖关系的宇宙中,或者将项目限制为只使用[本地库](https://clojure.org/guides/deps_and_cli#_using_local_libraries), tools.deps应该有效地在脱机模式下工作,因为它首先从缓存中解析,对吧?deps不应该试图连接到clojars或maven,对吧?
by
听起来你可能没有uberjar?如果你有,难道jar里面不是已经有了一切?因此,它就不会尝试拉取缺失的内容吗?
...