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驱动程序,我们需要AOT几个:gen-class命名空间,我们使用它们作为代理JDBC驱动程序。目前,我们必须在不同目录中运行clj -X:deps prep;如果可以通过传递别名给prep来执行此操作,则可以让我们使用单个命令完成此操作。

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

3 答案

0

编辑

为此问题添加了一个补丁到JIRA问题

0

目前我们不支持的合理原因是(例如,机器上所有的项目共享相同的缓存库路径)。为什么这些驱动程序不能作为独立的、按需包含的项目?或者提供为工件?(artifacts)

感谢你快速的回复,Alex。让我试着更详细地解释一下用例

我们将各种驱动程序作为独立的子项目列出,并根据需要作为`:local/root`坐标包含它们。我们有一个`:drivers`别名,它包含我们用于各种本地开发任务的所有驱动程序;我们不将它们作为顶级`:deps`包含,因为我们用不同的过程构建它们。

有时我们执行`clj -M:run`(这样就不会将驱动程序子项目包含在类路径上),有时我们执行`clj -M:drivers:run`(这样就把驱动程序子项目包含在内)...我们遇到的问题是,没有简单的方法来准备别名`:drivers`添加的子项目,除非手动`cd`到每个相应的目录并单独准备它们。

我想出的解决方法是,在单独的目录中创建一个空白的`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(Ahead-of-Time编译)的文件捆绑成单独的工件,但是将它们推送到Clochars,或者设置一个S3 bucket作为Maven仓库,或者类似的东西(并且设置CI以在更改时自动更新)如果不是必须的,我并不想这么做。此外,这将使本地调整这些文件并测试更改变得更加困难。

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

我不确定我是否理解了为什么这会有所不同。我的理解是,这最终不会与有人手动将问题别名中的所有`:deps`/`:extra-deps`复制粘贴到项目`deps.edn`的顶级`:deps`中然后运行`clj -X:deps prep`有所不同。(唯一的不同之处在于我们可能准备的库比之前更多;但我们并没有以不同的方式准备材料。)
by
我认为我误解了您的请求,以为您想在依赖中指定别名而非原始项目的别名。
by
没错,如果我说得不明确,先声明抱歉。我们只是想在项目准备中包含或不包含其中的某些别名。
by
添加另一种情景:如果您有一个根据 Polylith 构建的工程,在顶级 EDN 文件中通常没有 :deps,所有用于开发的内容都通过 :dev 别名引入。

有子工程带有自己的 deps.edn,可以通过此路径有效地准备依赖项,但在您最初开发时,您只有 :dev 别名,因为您尚未声明如何构建工件(这在 "项目" 中会这样做)。

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

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

...