2024 Clojure 状况调查 中分享你的想法!

欢迎!请查看 关于 页面以获取有关如何操作的更多信息。

0 投票
tools.namespace

在路径 {{public/js/out/foo/bar.cljc}} 中有一个 cljc 文件,ns 形式为 {{(ns foo.bar)}},这将导致命名空间 {{foo.bar}} 重新加载。

这有问题,因为 ClojureScript 编译器会将所有输入文件复制到 {{:output-dir}} 用于源映射。最近,随着越来越多的库开始使用 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 投票
...