请在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,这种情况偶尔会发生,并可能导致 healenbug。唯一的解决方案是将 spec 命名空间与定义它们的文件的同名空间保持一致吗?

1 个答案

0

被选中
 
最佳答案

Specs 在注册中是有意被覆盖的,因为您在 REPL 中经常这样做。

然而,可能需要在发生这种情况时发出警告,或者有一个类似于 *warn-on-spec-replace* 的设置来实现这一点。


编辑
编辑:不用在意了,我注意到测试文件的末尾有一个注释区块。

谢谢,Alex!

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

你能告诉我如何在项目中运行测试吗?
所有的 contrib 项目 都是用 Maven 构建的,你应该能够使用 `mvn clean test` 运行测试,或者使用 `mvn clean package` 构建jar,或者使用 `mvn install` 安装本地快照。

预知,我们可能不会发布更多的 clojure.spec.alpha 版本,因为我们正在为 clojure.spec-alpha2 仓库中的下一个 spec 版本工作。不过这两种方法的变更可能是相似的。
感谢您的帮助,Alex!我在这里打开了一个相关的问题: https://clojure.atlassian.net/projects/CLJ/issues/CLJ-2578
...