请在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环境。

我认为对于工具库命名空间来说,忽略文件路径和命名空间不匹配的更改是有意义的。
另一个问题以及可能的修复方法是理解为什么在这种情况下依赖关系解析不起作用:依赖于输出目录上的cljc文件中的协议的命名空间不会被重新加载。

19 个答案

0

评论者:stuart.sierra

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

0
评论者:duarre

太好了!

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

两点说明

每次我调用刷新时,我都会得到关于目录被忽略的警告。这确实增加了一些杂乱,但在大多数情况下可能是可接受的,因为系统重启可能会记录几行日志。

可能存在问题的一个因素是,如果某个文件在某个时间点有错误的ns声明,例如用户不小心在名称上有错别字,则整个目录会被忽略,直到调用{{clear}}。这可能会导致混淆。如果修复了有问题文件的话,自动移除被忽略的目录是否合理?看起来这在{{find-files}}中是可能的。
0
by

评论者:deraen

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

0
by
...