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 项目上进行了测试,这确实忽略了这些。

有两点注意事项

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

可能存在问题的一个因素是,如果单个文件在某个时间点的 ns 声明有问题,例如用户不小心在名称上犯了错,那么整个目录将被忽略,直到调用 {{clear}}。这很可能会引起混淆。如果修复了有问题的文件,自动移除被忽略的目录有意义吗?看起来这在 {{find-files}} 中是可能的。
0

评论者:deraen

-5 补丁修改了 {{find-files}} 以检查目录中如果所有的 ns 声明都已经修复,忽略了哪些目录。我不得不把副作用从谓词函数移动到 {{find-files}},所以这个更改并不是最干净的,但应该可以工作。如果这种做法看起来是好的,我应该能够稍微清理一下。

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