Las mejores prácticas en la construcción y despliegue de aplicaciones de Clojure: buenos tutoriales?

StackOverflow https://stackoverflow.com/questions/2391711

Pregunta

Soy nuevo en Clojure, y estoy empezando a experimentar con la construcción de una aplicación.

Hasta ahora, todo lo que he visto sobre tutoriales sobre la compilación de programas de Clojure implica la interactividad. Por ejemplo, "cargar el REPL y tipo (carga-archivo 'esto o aquello') para ejecutar. Esto está muy bien, pero no es suficiente.

Estoy tan acostumbrado a los idiomas de edición-compilación-correr de lenguajes como C o Delphi, que estoy instintivamente impulsado a realizar ediciones, después haga clic en "M-x de compilación".

El problema es que "Lein uberjar", que entiendo que es el equivalente a "marca", es muy lento para ejecutar incluso para un hola mundo. Así que voy a tener que encontrar la manera de este "desarrollo interactivo" funcionan las cosas, deje de usar el uberjar como si fuera maquillaje rápido, y guardarlo sólo para el final del día.

Otra cosa que noté mientras que la construcción (usando uberjar Lein) es que la aplicación GUI pequeña estoy trabajando en marcos aparece en el proceso de compilación, como si fueran ejecutar durante la compilación. Sólo parece un poco contrario a la intuición para mí; que no es tan análogo a la "marca" como había pensado.

Yo sé la manera de desarrollar Lisp cosas está trabajando de forma interactiva en el REPL, y yo no estoy tratando de cambiar eso: me gustaría que adaptarse a esta forma de vida. Por desgracia, he visto poco en la forma de documentación sobre cómo hacerlo. Por ejemplo, la forma de restablecer el estado actual de la máquina. Sólo parece un poco desordenado a sólo mantener la compilación de fragmentos individuales sobre la marcha sin ser capaz de hacer algún tipo de reajuste.

La mayoría de los tutoriales que he visto en Clojure (y Lisp), en general, parecen centrarse en la piratería en el REPL. Las mejores prácticas en la implementación de aplicaciones sigue siendo un misterio para mí. Mis usuarios sólo van a ser los usuarios; que no van a ser los desarrolladores que se van a cargar archivos en un REPL.

Así que aquí está mi pregunta: ningún recurso para una buena información o tutoriales sobre todo el proceso de construcción de una aplicación Clojure, incluyendo el despliegue?

(Nota: Tengo todos los requisitos previos instalados y de trabajo (por ejemplo, Emacs, limo, Leiningen, etc.), así que esto no es una pregunta acerca de eso).

¿Fue útil?

Solución

Un par de consejos rápidos, a continuación, algunos enlaces:

No utilice lein uberjar durante el desarrollo; prefieren lein jar. La diferencia es que pone lein uberjar todas sus dependencias en el jar generada (incluyendo Clojure sí mismo), por lo que su única JAR es un completamente autónomo paquete con su aplicación en el interior; lein jar solamente sacude su propio código. El enfoque uberjar tiene beneficios obvios para el despliegue, sino para el desarrollo, que debe ser capaz de utilizar sólo la ruta de clase apropiada cuando se ejecuta la aplicación, ahorrándose el tiempo necesario para preparar una uberjar. Si no desea la mano de administrar la ruta de clase para las ejecuciones de prueba, visita nuestra lein run complemento .

Además, más probable es que la mayor parte de su código no debe ser en realidad AOT compilado. AOT es necesario en algunos escenarios de interoperabilidad de Java, pero la mayoría de las veces se lleva a uno un ligero aumento en la velocidad de inicio y molestos problemas con la compatibilidad binaria con diferentes versiones de Clojure. Supongo que la última cuestión no es relevante para un uberjar-ed aplicación independiente tipo de proyecto, pero cualquier código de la biblioteca al menos se debe dejar de ser JIT-ed, si es posible. Con Leiningen, se puede poner una cláusula :namespaces en forma defproject en project.clj para determinar qué espacios de nombres que deberán elaborarse; lo que deja a cabo actualmente será JIT-ed por defecto. Las versiones anteriores de Leiningen utilizan para compilar todo por defecto, que en realidad es una buena razón para actualizar!

En cuanto a las ventanas que hacen estallar a cabo durante la compilación, me imagino que usted está funcionando ya sea código de la ventana de salida saltan durante el tiempo de expansión de la macro o fuera de cualquier definición de función o construcción similar. (Algo así como un (println "Foo!") en el nivel superior.) Eso es algo que no debe hacer, supongo - a menos que usted está planeando para ejecutar el código como una secuencia de comandos, de todos modos. Para evitar el problema, wrap-efectuar lado código en definiciones de funciones y proporcionar un punto de entrada para su aplicación utilizando la cláusula :main en project.clj. (Si dice :main foo, entonces la función -main del espacio de nombres foo será utilizado como punto de entrada a su aplicación Ese es el defecto, de todos modos, y por lo menos lo anterior lein run mencionada parece tener el nombre hardcoded -. No está seguro acerca Lein sí mismo.)

En cuanto a restablecer el estado de la REPL - simplemente puede reiniciarlo. Con BABA, M-x limo-reinicio-inferior-Lisp hará exactamente eso, manteniendo el resto de estado de la sesión de Emacs.

Véase también estas discusiones en el grupo Clojure Google:

  1. Clojure para administración del sistema
  2. Prepping clojure para el envasado (era: Re: Clojure para la administración del sistema)
  3. Leiningen, Clojure y bibliotecas: ¿Cuál falto

Otros consejos

No, no entran en funciones en el REPL.

Puede editar los archivos de origen, como de costumbre. La ventaja Lisp es que tiene el sistema que ejecuta en segundo plano al mismo tiempo, para que pueda compilar funciones individuales de su archivo de origen y ponerlos en el sistema que ejecuta, o incluso reemplazarlos allí.

Si utiliza limo, pulsa C-c C-c en el archivo de origen para compilar y cargar la función en el punto. A continuación, puede cambiar a la REPL a prueba y explorar, pero cualquier cosa que desee persistir como fuente, poner en los archivos de origen.

Tutoriales por lo general comienzan por las cosas de escritura en el REPL, porque no hay mucho que se necesita configurar para esto, pero el desarrollo seria integra la gestión de archivos del sistema y la fuente de corriente.


Sólo para ilustrar, mi flujo de trabajo habitual (estoy usando Common Lisp, pero Clojure es similar) es como sigue:

  • Inicio Emacs
  • M-x slime para iniciar limo, el sistema Lisp, y conectar los dos a través de Swank
  • , load-system (comandos) foo para cargar el proyecto actual (compilar sólo si es necesario) en la imagen
  • interruptor C-x b a un buffer fuente
  • C-c ~ hacer que el directorio de origen del directorio actual y el paquete fuente del paquete actual de la REPL

Ahora, estoy configurado con mi sistema funcionando en segundo plano. Trabajo es entonces:

  • cambiar o añadir una definición de función o de clase
  • C-c C-c para compilar y cargarlo en la imagen
  • en la posición REPL, prueba
  • depuración

No hay pausas significativas de compilación, porque no puedo compilar toda la cosa a la vez, a las definiciones individuales.

scroll top