2024年Clojure现状调查!中分享你的想法。

欢迎!请查看关于页面以了解更多关于如何使用本站的信息。

+6
tools.deps
编辑

目前无法使用clj -X:deps prep仅对别名中的:deps:extra-deps进行依赖准备。如果添加支持一个:aliases选项来准备这些依赖,将非常有帮助,例如:

clj -X:deps prep :aliases '[:my-alias]'

真实案例:在Metabase中,我们有一个添加多个:local/root数据仓库驱动子项目到我们的类路径上的:drivers别名。对于我们的Spark SQL驱动,我们需要AOT一些用于作为代理JDBC驱动的:gen-class命名空间。目前,我们要求人们在不同目录中运行clj -X:deps prep,如果有一个方法可以传递别名给准备命令,我们将只需单个命令即可完成。

JIRA问题:https://clojure.atlassian.net/browse/CLJ-2652

3个答案

0

编辑

为该JIRA问题添加了一个补丁

0

我们有充分的理由不支持这个功能(例如,机器上的所有项目都共享相同的缓存的库路径)。为什么这些驱动程序不能放在单独的项目中,并根据需要包含进来?或者作为工件提供呢?

感谢您的快速回复,Alex。让我详细解释一下用例。

我们将各种驱动程序作为单独的子项目公开,并根据需求使用 `:local/root` 坐标包含它们。我们有一个 `:drivers` 别名,它包括我们用于各种本地开发任务的驱动程序;我们不将它们作为顶层的 `:deps` 包含在内,因为我们是用不同的过程构建它们的。

我们有时会 `clj -M:run`(这样就不会将驱动程序子项目包含在类路径中),有时会 `clj -M:drivers:run`(这样就会包含我们的驱动程序子项目)... 我们面临的问题是,没有简单的方法可以整理 `:drivers` 别名添加的子项目,除非手动在各自的目录中分别准备。

我找到的解决方案是在一个单独的目录中创建一个虚拟的 `deps.edn` 文件,该文件包含与 `:drivers` 别名相同的 `:local/root` `:extra-deps`,但位于顶层 `:deps` 之下。人们可以 `cd` 到这个目录并在那里运行 `clj -X:deps prep`,而无需为每个驱动程序目录分别执行。因此,我们现在的首次配置说明基本上是

```
clj -X:deps prep && cd modules/drivers && clj -X:deps prep
```

在两个不同的文件夹中进行两次 `clj -X:deps prep` 的操作并不是那么糟糕,但只需一次性运行 `clj -X:deps prep :aliases '[:drivers]'`(而不需要创建/维护虚拟的 `deps.edn` 文件)会好得多。


虽然没有必要,我们可以将需要 AOT 的文件打包成单独的工件,但这将使得在本地调整这些文件和测试更改变得更加困难。此外,如果没有强制,我真的不希望将它们推送到 Clojars,或设置一个 S3 存储桶作为 Maven 仓库,或者类似的东西,并设置 CI 以自动在更改时更新它。

影响同一台机器上的其他项目

我不确定为什么这会有任何不同。我的理解是,这最终不会与有人手动将别名中的所有 `:deps`/`:extra-deps` 复制粘贴到项目 `deps.edn` 的顶级 `:deps` 中然后运行 `clj -X:deps prep` 有任何不同。(唯一的区别是我们可能准备更多的库,但我们并没有以任何不同的方式准备。)
我认为我误解了您的请求,您是想指定依赖项的别名,而不是原始项目的别名。
对的,如果我没有表达清楚,我向您道歉。我们只是想能够对项目进行准备,无论是有一些各种别名还是没有这些别名。
再添加一个场景:如果您有一个基于Polylith的项目,通常顶层EDN文件中没有:deps -- 开发所需的一切都通过:dev别名引入。

有子项目具有自己独立的deps.edn文件,但您可以通过该路径有效地准备依赖项,但在您最初进行开发时,您只有:dev别名,因为您还没有达到声明如何构建工件的地步(这就是您在“项目”中做的那样)。

我可以说,作为一般规则,deps.edn环境中的任何和所有工具都应该允许在计算工具执行工作时所需的基础时指定:aliases(我不是指通过-T或-X进行初始CLI调用,而是工具本身应该始终接受一个:aliases执行参数,并使用它来计算项目的基础)。
0

Clojure CLI预发布版本1.10.3.1082增加了对基础修饰符的支持,包括:aliases。

...