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

欢迎!请查看关于页面以了解如何工作的更多信息。

+6
tools.deps
编辑过

目前,没有方法仅使用clj -X:deps prep准备作为别名中包括的:deps:extra-deps的依赖。添加一个名为:aliases的选项,以准备这些内容,非常有帮助,例如:

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

实际应用场景:在Metabase中,我们有一个:drivers别名,它将多个:local/root数据仓库驱动子项目添加到我们的类路径中。对于我们的Spark SQL驱动程序,我们需要对几个使用作为代理JDBC驱动程序的:gen-class命名空间进行AOT处理。目前,我们让人们在不同的目录中运行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` 下。人们可以进入这个目录运行 `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'ed 的文件作为单独的工件,但将它们推送到 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。

...