gpt4 book ai didi

clojure - Enlive 模板自动重新加载/检测 Pedestal 服务中的更改

转载 作者:行者123 更新时间:2023-12-02 04:57:28 26 4
gpt4 key购买 nike

我正在使用 autoreload-server 示例,它非常适合在使用 ns-tracker 更改 .clj 文件时重新加载命名空间。

https://github.com/pedestal/samples/blob/master/auto-reload-server/dev/dev.clj

但是,它不会在 resources/public 目录中获取更改以激活模板。我已将我的模板路径添加到 defn watch 中的向量:

`([] (watch ["src" "resources" "resources/public" "public"]))`

以及在使用 enlive detemplate 的命名空间中:

(net.cgrand.reload/auto-reload *ns*)

但是这不起作用。我的假设是 ns-tracker 仅适用于 clj 文件,并且我错误地使用了 enlive 重新加载功能。

有没有人在使用 enlive 并弄清楚了这个问题,或者有什么想法可以尝试?

最佳答案

我希望 Enlive Issue #6: Auto-reloading of templates于 2013 年 12 月上旬在版本 1.1.5 中由 this commit 解决.但是,在我的测试中,我无法确认它是否已修复。我可能做错了什么。


注意:我认为您引用的示例可以追溯到 pre-0.2.0 tooling changes for Pedestal .我可能是错的,但我认为您最好遵循当前文档,而不是那个示例文件。


Pedestal's 'hello world' service app的主要建议(可能会改变)是:

  1. 使用 ns-tracker找出要重新加载的命名空间。

  2. :resource-paths ["config", "resources"] 添加到 project.clj 以便 Enlive 可以找到您的静态 HTML 资源。

这些步骤不足以导致资源更改触发重新加载,因为 ns-tracker不会关注:resource-paths。以下是详细信息:

  1. ns-tracker依赖clojure.tools.namespace.find/find-clojure-sources-in-dir .
  2. clojure.tools.namespace.find/find-clojure-sources-in-dir

当你仔细想想,你就会明白为什么ns-tracker不获取资源;它们不是 Clojure 命名空间。在我看来,这是连贯的设计决策,命名为 ns-tracker

不过,从实用的角度来看,很明显,从 Pedestal 的角度来看,我们确实希望在资源更改时重新加载


现在,让我补充一点。从工具的角度来看,假设您确实在资源目录上设置了一个监视。即便如此,要以细粒度的方式识别哪些特定的 Clojure namespace 会受到影响并不容易。一个资源可以用作 defsnippet通过多个 detemplate。因此,一项资源更改可能会影响多个 Clojure 命名空间。指向资源的字符串甚至可以动态构造。因此,在一般情况下,可能无法确定要重新加载的确切最小命名空间集。

综上所述,无论何时资源发生变化,重新加载所有 Clojure 命名空间应该是“简单”且足够安全的。


所以,总而言之,我自己还没有解决这个问题,但希望我上面的解释能帮助插入这个问题。


关于clojure - Enlive 模板自动重新加载/检测 Pedestal 服务中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20108899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com