我想知道是否可以以及如何实现模块系统。
以下是它如何工作的示例:我有一些文件夹(例如modules
),这个文件夹有一堆clojure文件导出一些变量(例如name
和regex
),所有模块都加载到一个列表中,因此可以迭代,模块可以被删除。
你能做的最简单的事情就是用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文件。功能允许遍历类路径,寻找随插件一起分发的小元文件,提示需要。