2024年Clojure调查问卷中分享您的想法!

欢迎!请查看关于页面以获取更多有关此方法的详细信息。

0
Clojure
重新标记

在大型代码库和团队中,可能会出现不同的人以不同的别名'require'同一个命名空间

h.clj
(ns hello.core)

f.clj
(ns foo.core
    (:require [hello.core :as hc]))

b.clj
(ns bar.core
    (:require [hello.core :as h]))

如果您注意到,我参与的大型项目往往即使在遵循公约的情况下,同一个命名空间也会有不同的别名。这是人的缺点,在大型团队中这往往会失控。这使得使用grep等简单工具查找命名空间和其中函数用法变得困难(比如在上述情况中使用hc/some-funch/some-func

我想提出的是,在ns宏本身中有一个类似的功能

(ns hello.core :default-alias <my-alias>)

当需要此ns时

(ns foo.core 
    (:require [hello.core :default-alias])

我们将自动获得一个<my-alias>来引用命名空间,这样我们就可以执行<my-alias>/some-func

这将导致在语言级别上强制执行的一致代码
我认为这可以通过在命名空间中存储某种类型的元数据来实现

2 个回答

+6

已被选中
 
最佳答案

您可以使用 clj-kondo 中的 :consistent-alias 检查器来强制执行此类一致性

https://github.com/borkdude/clj-kondo/blob/master/doc/config.md#alias-consistency

太棒了!作为后续,clj-kondo 是否可以添加用户配置?比如我要跨项目的默认配置?或者建立一个团队标准?
用户配置不是设计支持的。您可以在设计原则 5 中了解相关信息:https://github.com/borkdude/clj-kondo/blob/master/doc/dev.md
如果您觉得这很重要,我建议您编写一个小脚本来复制您的配置。
+1 点赞

你好,谢谢你的建议,这是我没有看到过的。

我认为这个建议的一个缺点是别名会“从天而降”,这会带来它自己的问题。我的意思是,这当然是重点所在,但是在查看特定消费者命名空间时,如果不找到和解决所有其他引用的命名空间,就无法知道别名指的是什么。

无论如何,我们并不打算向ns宏或命名空间系统添加任何额外的复杂性,所以我认为不太可能添加这样的功能。

by
是的,我也担心过“凭空出现”的问题 :)

不管怎样,我会自己在Clojure的分叉上尝试一下
by
这个问题还有其他问题

如果由于某种原因源命名空间更改了默认别名,所有消耗这些代码都会出错。

如果两个命名空间恰好有相同的默认别名,并且您尝试同时引入它们,您将遇到冲突。

任何依赖于静态代码检查的工具都不会知道(hc/greet)是什么 -- 当前它们看到:as hc别名并可以“解析”hc/greet符号而无需加载命名空间。
...