13

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

但是我看不到如何使用 Leiningen 执行此操作 - 我只能看到常见问题解答checkouts中描述的修复程序,它似乎没有那么强大。

莱茵会这样做吗?我应该改用 Gradle 吗?还是不需要这种东西?

更多上下文:我想知道如何构建一个支持插件的模块化应用程序(我想这意味着将 jars 转储到类路径中)。并且想知道我可以在多大程度上将其构建为核心 + 插件(我想我应该能够使用 Clojure 的动态代码加载来做一些事情,而不必使用 Java/OSGi)。所以我想单个项目的驱动动机来自想要某种方式将所有东西(核心+默认插件)打包成一个对最终用户来说很容易的单一 blob,但也可以分割(并且它是构建和分片测试,测试各个模块的逻辑独立性)。欢迎对此提供更多一般性建议

更新

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

4

1 回答 1

9

首先,Leiningen 似乎不像 Maven 那样支持模块层次结构。结帐是它拥有的下一个最接近的东西。不过,在 Clojure 中开发模块化应用程序就足够了。

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

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

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

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

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

于 2012-04-23T04:38:01.130 回答