Enlive模板自动重新加载/检测基座服务中的更改

时间:2013-11-20 22:58:26

标签: clojure enlive pedestal

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

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

但是,它没有对资源/公共目录中的活动模板进行更改。我在defn watch中添加了我的模板路径:

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

在使用enlive deftemplate的命名空间中也是如此:

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

然而,这不起作用。我的假设是ns-tracker仅适用于clj文件,而且我使用的是enlive重载功能。

是否有人使用了enlive并想出这个想法,或者有什么想法尝试?

2 个答案:

答案 0 :(得分:0)

我希望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资源。

  3. 这些步骤不足以导致更改资源以触发重新加载,因为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
    3. 当你考虑它时,你可以看到为什么ns-tracker没有获取资源;它们不是Clojure命名空间。在我看来,这是一个连贯的设计决策,名称为ns-tracker

      但实际上,很明显,从Pedestal的角度来看,当资源发生变化时,我们确实想重新加载


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

      所有这些都说,只要资源发生变化,就应该“轻松”,安全地重新加载所有Clojure名称空间。


      所以,总而言之,我自己并没有解决这个问题,但希望我上面所解释的将有助于推动这一进程。


答案 1 :(得分:0)

我无法找到现成的工作解决方案,所以我最终编写了一个小环形包装来完成这项工作,请参阅https://github.com/kolov/enlive-reload