请在2024 Clojure 现状调查中分享您的想法!

欢迎!请参阅关于页面以了解更多有关此工具的信息。

0
Clojure

最近,我在我所在公司的项目中发现了一个bug。

基本上,发生的事情是在一个测试命名空间内部,我们导入了两不同的命名空间,我们可以称之为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的代码库中,这种情况偶尔会发生并造成heisenbug。唯一的解决方案是不是将spec名称空间放到定义它们文件的同一个ns中吗?

1 答案

0

被选中
 
最佳答案

spec是有意被覆盖的,就像你经常在REPL中这样做一样。

虽然如此,但在发生这种情况时发出警告或有一个类似于*warn-on-spec-replace*的设置可能会很有用。


编辑
编辑:不必在意,我发现测试文件末尾有一个注释块。

谢谢,亚历克斯!

很抱歉打扰你,但我对尝试实现 *warn-on-spec-replace* 感兴趣,但我找不到在 clojure.spec.alpha 中执行测试的方法,这样我就可以测试我的实现了。

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

顺带一提,我们可能不会再发布 clojure.spec.alpha 的任何新版本,因为我们正在 clojure.spec-alpha2 仓库中开发 spec 的下一个版本。不过,这两个版本中的更改可能大致相同。
感谢您的帮助,亚历克斯!我在这里打开了一个相关问题: https://clojure.atlassian.net/projects/CLJ/issues/CLJ-2578
...