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

欢迎!请参阅关于页面以了解更多关于如何工作的信息。

0
tools.namespace

路径为{{public/js/out/foo/bar.cljc}}的cljc文件和ns形式{{(ns foo.bar)}}会导致命名空间{{foo.bar}}被重新加载。

这很成问题,因为ClojureScript编译器会将所有输入文件复制到{{:output-dir}}以用于source-map。最近,由于越来越多的库开始使用cljc,这已开始在使用Clojure环境的库中引起问题。Cljs编译将导致加载库代码,重新定义协议等,并破坏Clojure环境。

我认为对于tools.namespace忽略文件路径和命名空间不匹配的更改是有意义的。
另一个问题是,了解为什么依赖解析在此情况下不起作用:依赖输出目录上的cljc文件中的协议的命名空间不会被重新加载。

19 答案

0

评论者:stuart.sierra

使用{{c.t.n.repl}},可以通过调用{{c.t.n.repl/clear}}来初始化新的跟踪器,将一个被忽略的目录再次添加到扫描中。

0
评论者:deraen_

太好了!

我在本地应用并安装了它,并使用一个我已知Cljs输出包含某些[[.cljc}}命名空间的Boot项目进行了测试,这确实忽略了这些。

两条注释

每次我调用刷新时,我都会收到忽略目录的警告。这可能有点杂乱,但在大多数情况下,系统重启可能无论如何都会记录几行。

可能存在问题的另一件事是,如果一个文件在某个时刻有不好的ns声明,例如用户不小心在名称上输入了误拼,则整个目录都将被忽略,直到调用{{clear}}。这可能会引起混淆。如果在修正了有问题的文件之后自动删除被忽略的目录,这合理吗?看起来在{{find-files}}中这是可行的。
0

评论者:deraen

-5补丁修改了{{find-files}}来检查目录中所有ns声明是否都已修复。我不得不将副作用从谓词函数移动到{{find-files}},因此这不是最干净的变化,但应该是有效的。如果这看起来像是一个好的方法,我应该可以稍微清理一下。

0
参考:https://clojure.atlassian.net/browse/TNS-45(由deraen报告)
...