2012-04-22 14 views
12

Creo (ver a continuación) que me gustaría estructurar un proyecto Clojure como módulos múltiples, con dependencias ordenadas, tal como Maven me permite hacer con multi-modules projects.¿Cuál es la mejor manera de estructurar y crear aplicaciones Clojure con complementos?

Pero no puedo ver cómo hacerlo con Leiningen, todo lo que puedo ver es la corrección checkouts descrita en el FAQ que no parece ser tan poderosa.

¿Le hará esto? ¿Debería usar Gradle en su lugar? ¿O no se necesita este tipo de cosas?

Un poco más de contexto: me pregunto cómo diseñar una aplicación modular que sea compatible con los complementos (lo que supongo significa que los archivos descargados en el classpath). Y me pregunto hasta qué punto puedo estructurar eso como core + plugins (estoy pensando que debería poder hacer algo con Clojure's dynamic code loading y no tener que ir con Java/OSGi). Así que supongo que la motivación para un proyecto solo proviene de querer alguna forma de empaquetar todo (los complementos core + default) como un blob simple que es fácil para el usuario final, pero que también se puede dividir (y que es construido y probado en fragmentos, probando la independencia lógica de cada módulo). obtener más consejos generales sobre este es bienvenido

actualización

Una posible solución que no se mencionan a continuación es el uso de un Maven plugin - Asumo que apoya todo lo Maven hace, pero compila Clojure, así que voy a trabajar con módulos anidados , etc.

Respuesta

9

En primer lugar, no parece que Leiningen sea compatible con una jerarquía de módulos como Maven. Los pagos son lo más cercano que tiene. Sin embargo, debería ser suficiente desarrollar una aplicación modular en Clojure.

Para la estructura del proyecto, tendría un proyecto API, un proyecto "central", los propios plugins y un proyecto de empaquetado por separado. El núcleo y los complementos solo deberían depender de la API. Qué herramienta de compilación usas para crear el proyecto de embalaje depende de ti. Es probable que Gradle sea más eficaz en el manejo del embalaje, sin embargo, la funcionalidad de "pago y envío" que ofrece Leiningen podría facilitar el desarrollo del sistema en su conjunto.

Me gustaría echar un vistazo al código de Leiningen y Noir para descubrir cómo manejar esto de manera efectiva.

Para cargar dinámicamente los plugins, me gustaría empezar con mirar cómo Noir maneja en dos de sus archivos:

  • server.clj tiene carga espacio de nombres para todos los archivos bajo un espacio de nombres particular. Debajo del capó usa tools.namespace, pero se puede ver fácilmente cómo se usa en require en cada espacio de nombre bajo una base particular. Así es como Leiningen maneja las tareas personalizadas también: la definición base para la tarea debe estar en el espacio de nombres leiningen. $ Task.
  • core.clj tiene lo que usaría para el registro de complementos. En resumen, use un mapa en un atom y agregue complementos a ese mapa. Aconsejaría envolver el registro con una macro para mantener su código más limpio.

Lo que he enumerado anteriormente debería ser suficiente si no necesita manejar el agregar complementos en tiempo de ejecución. Si no tiene todos los complementos en el classpath durante la puesta en marcha, recomendaría utilizar pomegranite para agregar entradas al classpath. Puede ver un ejemplo en classpath.clj.

+0

gracias por todo eso. –

+1

Actualizado: Parece que Leiningen ahora es compatible con la jerarquía de módulos ... según la descripción del complemento [lein-modules] (https://github.com/jcrossley3/lein-modules). – pershyn

Cuestiones relacionadas