如何最好地使用插件构建和构建Clojure应用程序?

and*_*oke 12 plugins clojure gradle leiningen

我认为(见下文)我想将Clojure项目构建为具有有序依赖性的多个模块 - 就像Maven让我可以使用多模块项目一样.

但是我无法看到如何用Leiningen做到这一点 - 我只能看到FAQcheckouts描述的修复程序看起来并不那么强大.

莱恩会这样做吗?我应该使用Gradle吗?或者不需要这种东西?

更多上下文:我想知道如何构建支持插件的模块化应用程序(我想这意味着将jar放在类路径上).我想知道我可以在多大程度上构建核心+插件(我认为我应该能够使用Clojure的动态代码加载而不必使用Java/OSGi).因此,我认为单个项目的驱动动力来自于想要将所有内容(核心+默认插件)打包成一个易于最终用户使用的单个blob,但也可以将其划分(并且可以将其构建为在片段中测试,测试每个模块的逻辑独立性).关于这一点的更一般的建议是受欢

更新

下面没有提到的一个可能的解决方案是使用Maven插件 - 我假设它支持Maven所做的一切,但编译Clojure,因此将使用嵌套模块等.

det*_*erb 9

首先,Leiningen似乎不像Maven那样支持模块层次结构.结帐是它最接近的东西.尽管如此,在Clojure中开发模块化应用程序应该已经足够了.

对于项目结构,我将有一个API项目,一个"核心"项目,插件本身和一个单独的打包项目.核心和插件应该只依赖于API.您用来创建包装项目的构建工具取决于您.Gradle可能在处理包装方面更有效,但是Leiningen提供的"结账"功能可以使整个系统的开发变得更加容易.

我会看看Leiningen和Noir的代码,以找出如何有效地处理这个问题.

为了动态加载插件,我首先看看Noir如何处理它们的两个文件:

  • server.clj为特定命名空间下的所有文件加载名称空间.它使用tools.namespace,但您可以很容易地看到它如何用于require特定基础下的每个命名空间.这也是Leiningen处理自定义任务的方式 - 任务的基本定义应该在leiningen.$ task namespace中.
  • core.clj有我用于插件注册的东西.总之,使用a下的地图atom并将插件添加到该地图.我建议用宏来包装注册,以保持代码清洁.

如果您不需要在运行时处理添加插件,我上面列出的内容就足够了.如果在启动期间没有类路径上的每个插件,我建议使用pomegranite在类路径中添加条目.您可以在classpath.clj中看到一个示例.