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将尝试解析deps(例如,对于clojurescript),而这正是我不想要的(事实上,由于网络设置,它们将失败)。

是否有建议的方法只将uberjar视为哑本地依赖项,而不使用更高层的依赖项解析机制?我希望利用deps.edn中的选项(例如设置源路径等),只是预先在uber.jar中加载一些库(假设在一个有限的环境中需要的所有依赖项)。

另一种可能是将它安装到本地的.m2中,并作为maven坐标进行处理,这应该(希望)可以防止clj尝试在线嗅探依赖项。
我希望本地jar方法能够有效。

1 个回答

+1

目前没有clj的“离线”模式,并且jar依赖项被检查, getattr找到jar内部的pom,并据此获取依赖项。我想如果生产了一个不包含内部pom的uberjar,这可能足够了。

为什么你不去真正执行java -cp oz.jar clojure.main呢?在我看来,在这种场景下,clj提供的价值并没有真正超过这行命令。

我希望理论上的价值是类路径管理、脚本等。 管理源路径、利用别名等。 基本上是最小化路径和(非Maven)依赖设置方面的东西(如本地文件依赖、git依赖等)。 我将回退到手动路径和依赖管理以及脚本。
如果你使用的是uberjar,那么这些功能都不适用吗?
不在uberjar中的东西当然适用。 文件依赖、git相关内容、别名。 也不需要任何互联网连接,但可能在相对隔离的机器上通过本地解析链接。 Uberjar是为了简单方便地让oz的依赖在本机上车。 我以前用lein offline做这个,效果还不错(还是有点笨拙)。 当时认为clj是一个更好的解决方案,而不是通过脚本和不同类型的负载文件将类路径生成、文件依赖、本地jar和可选加载组合在一起。 我一度认为tools.deps可以简化事情。
作者:
一旦内容被合并到uberjar中,tools.deps就无法再对这些内容做任何有用的操作 - 它看上去就像一个巨大的工件。版本选择不起作用,类路径上合并内容不起作用,等等。别名用于修改依赖解析或类路径构建,但这些操作都因uberjar而失效。Uberjar的整个目的是没有其他内容。Uberjar与所有依赖解析和类路径工具是矛盾的,应该仅用于构建最终的应用程序jar文件进行部署(而且永远不要放入Maven中)。
作者:
所以我选择的替代方案(我在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的情况,对吗?
作者:
听起来你可能没有uberjar?如果你有了,jar里不是都已经包含了一切吗?所以它不会尝试拉取任何缺失的东西?
...