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

欢迎!请查阅关于页面获取更多有关如何使用本页面的信息。

0
Clojure

最近,我在我工作的公司的一个项目中发现了一个错误。

基本上,发生的事情是在一个测试命名空间中导入了两个不同的命名空间,我们可以称它们为first-ns和second-ns。

first-ns和second-ns都定义了具有相同名称的spec,如下所示:

(ns first-ns)
(s/def :same/name
    int?)

(ns second-ns)
(s/def :same/name
    string?)

我的问题是,是否有方法使Clojure编译器对这种类型的名称冲突发出警告?在大型的代码库中,有数百个spec时,这种情况偶尔会发生,并可能导致海森堡bug。唯一的方法是将spec名称空间化为与它们定义文件相同的ns吗?

1 答案

0

被选择
 
最佳回答

Specs 有意设计为在注册表中可覆盖的,就像您在REPL中经常做的那样。

但是,当发生这种情况时发出警告可能很有用,或者有一个设置比如 *warn-on-spec-replace* 来执行这一操作。

by
edited by
编辑:不用管了,我发现测试文件的末尾有一个注释块。

谢谢,Alex!

对不起打扰你,我对尝试实现 *warn-on-spec-replace* 感兴趣,但我找不到在 clojure.spec.alpha 中执行测试的方法,因此我无法测试我的实现。

你能告诉我如何在项目中运行测试吗?
by
所有贡献项目都使用 Maven 构建,你应该可以使用 `mvn clean test` 运行测试,或者使用 `mvn clean package` 构建 JAR 包,或者使用 `mvn install` 安装本地快照。

仅供参考,我们可能不会发布更多版本的 clojure.spec.alpha,因为我们正在开发 clojure.spec-alpha2 仓库中的下一个 spec 版本。不过,这两个版本中可能的变化大约是相同的。
by
谢谢你的帮助,Alex!我为这个问题在这里开了一个问题:https://clojure.atlassian.net/projects/CLJ/issues/CLJ-2578
...