请在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](https://clojure.atlassian.net/browse/TNS-45) (由deraen报告)
...