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>)

在require此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宏或命名空间系统增加任何额外的复杂性,所以我认为我们不太可能添加这样的功能。

是的,我也担心过这个“突然出现”的问题 :)

无论如何,我会在我的Clojure分叉版本中试试这个。
这个建议的其他问题

如果源命名空间因为任何原因更改了默认别名,所有消费代码都将失效。

如果两个命名空间碰巧有相同的默认别名,而你尝试同时引入它们,则会出现冲突。

任何依赖于静态检查代码的工具都不知道(hc/greet)是什么——目前它们看到:as hc别名,可以在不加载命名空间的情况下解析hc/greet符号。
...