请在 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,一个可以传递别名给 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`(以便包含我们的驱动子项目)...我们遇到的问题是,在不需要手动`cd`到每个相应的目录并分别准备它们的情况下,没有简单的方法来准备由`: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`并没有那么糟糕,但只执行一次`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进行指定,而是工具本身应该始终接受一个:aliases执行参数,并使用它来计算项目的基础)。
0

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

...