在clojure中制作一个插件系统

Making a plugin system in clojure

我想知道是否可以以及如何实现模块系统。

这是它如何工作的例子:我有一些文件夹(例如 modules),这个文件夹有一堆导出一些变量的 clojure 文件(例如 nameregex ), 所有模块都加载到一个列表中,因此可以迭代并从中删除模块。

你能做的最简单的事情就是用 load-file 一个一个地加载所有这些文件。 https://clojuredocs.org/clojure.core/load-file

否则你可以预编译你的插件的命名空间并使用一些 java 的本地技术加载它们(我不太了解,但我想有一些不错的库)

更新: 对于一些名为“/my/path”的目录,它可能如下所示:

(run! #(load-file (.getAbsolutePath %))
      (rest (file-seq (java.io.File. "/my/path"))))

注意,file seq 递归遍历目录,并包括所有文件(不仅是 *.clj)。也许您需要过滤它们:

(run! #(load-file (.getAbsolutePath %))
      (filter
       #(clojure.string/ends-with? (.getName %) ".clj")
       (rest (file-seq (java.io.File. "/my/path")))))

riemann,有一个插件系统设计,它提供了通过其初始化脚本在类路径中加载jar 文件的能力。这些功能允许遍历类路径,寻找随插件分发的小元文件,这些文件提示需要。