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

13

我认为(见下文)我想将Clojure项目结构化为多个模块,具有排序依赖项 - 就像Maven让我使用多模块项目一样。

但是我不知道如何使用Leiningen完成这个目标 - 我所看到的只有在常见问题中描述的checkouts修复方法,这似乎没有那么强大。

Lein可以做到这点吗?我应该改用Gradle吗?还是根本不需要这样做?

更多上下文:我正在思考如何设计支持插件的模块化应用程序(我想象中意味着Jar文件放置在类路径上)。我在想,在多大程度上可以将其结构化为核心+插件(我认为我应该能够使用Clojure的动态代码加载而不必用Java / OSGi)。因此,驱动一个“单一”项目的动机来自于希望以单个块的形式打包所有内容(核心+默认插件),这对最终用户很容易,但也可以被分割(并且以片段构建和测试,测试每个模块的逻辑独立性)。欢迎提供更一般的建议。

更新

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

1个回答

9
首先,Leiningen似乎不支持像Maven那样的模块层次结构。检出是它最接近的功能。但在Clojure中开发模块化应用程序应该足够了。
对于项目结构,我会有一个API项目、一个"core"项目、插件本身和一个单独的打包项目。核心和插件只应依赖于API。你使用哪个构建工具来创建打包项目取决于你。Gradle可能更有效地处理打包,但是Leiningen提供的"checkout"功能可以使整个系统的开发更容易。
我会查看Leiningen和Noir的代码,以找出如何有效地处理这个问题。
对于动态加载插件,我会从两个Noir文件中开始查看它们是如何处理的:
  • server.clj 对于特定命名空间下的所有文件进行了命名空间加载。在底层,它使用了tools.namespace,但是您可以轻松查看如何将其用于require特定基础下的每个命名空间。这也是Leiningen处理自定义任务的方式 - 任务的基本定义应该在leiningen.$task 命名空间中。
  • core.clj 是我用来进行插件注册的方法概述。简而言之,使用atom下的映射并向其中添加插件。 我建议使用宏将注册包装起来,以使您的代码更加清晰。
如果您不需要在运行时处理添加插件,那么我上面列出的内容应该足够了。如果在启动期间没有每个插件都在类路径上,我建议使用pomegranite将条目添加到类路径中。您可以在classpath.clj中看到一个示例。

1
更新:根据 lein-modules 插件描述,Leiningen 现在似乎支持模块层次结构。 - pershyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接