gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:06:10 25 4
gpt4 key购买 nike

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

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

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

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

更新

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

最佳答案

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

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

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

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

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

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

    关于plugins - 如何最好地使用插件构建和构建 Clojure 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10272559/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com