【问题标题】:How best to structure and build Clojure apps with plugins?如何最好地使用插件构建和构建 Clojure 应用程序?
【发布时间】:2012-04-22 22:10:25
【问题描述】:

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

但我不知道如何使用 Leiningen 执行此操作 - 我只能看到 FAQ 中描述的 checkouts 修复,它似乎没有那么强大。

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

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

更新

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

【问题讨论】:

    标签: plugins clojure gradle leiningen


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 更新:似乎 Leiningen 现在支持模块层次结构...根据lein-modules 插件描述。
    猜你喜欢
    • 2011-01-24
    • 2014-06-23
    • 1970-01-01
    • 2016-02-21
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多