que informatica hacer español deploy deployment lisp clojure leiningen

deployment - informatica - Mejores prácticas en la construcción y despliegue de aplicaciones Clojure: buenos tutoriales?



que es el deploy en java (2)

No, no ingresas funciones en REPL.

Edita sus archivos fuente, como de costumbre. La ventaja de Lisp es que tiene el sistema ejecutándose en segundo plano al mismo tiempo, por lo que puede compilar funciones individuales desde su archivo de origen y ponerlas en el sistema en ejecución, o incluso reemplazarlas allí.

Si usa Slime, presiona Cc Cc en su archivo fuente para compilar y cargar la función en el punto. Luego puede cambiar a REPL para probar y explorar, pero cualquier cosa que quiera persistir como fuente, la pondrá en sus archivos fuente.

Los tutoriales suelen comenzar escribiendo cosas en el REPL, porque no hay mucho que configurar para esto, pero el desarrollo serio integra el sistema en ejecución y la gestión de archivos fuente.

Solo para ilustrar, mi flujo de trabajo habitual (estoy usando Common Lisp, pero Clojure es similar) es así:

  • Comience Emacs
  • Mx slime para iniciar Slime, el sistema Lisp, y conectar los dos a través de Swank
  • , (comando) load-system foo para cargar el proyecto actual (compilando solo si es necesario) en la imagen
  • Cx b cambiar a un buffer de origen
  • Cc ~ hacer que el directorio fuente sea el directorio actual y el paquete fuente el paquete actual de REPL

Ahora, estoy configurado con mi sistema ejecutándose en segundo plano. Trabajar es entonces:

  • cambiar o agregar una función o definición de clase
  • Cc Cc para compilar y cargarlo en la imagen
  • cambiar a REPL, prueba
  • depurar

No hay pausas de compilación significativas, porque nunca compilo todo de una vez, solo definiciones individuales.

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

Hasta ahora, todo lo que he visto sobre los tutoriales sobre la compilación de programas Clojure implica interactividad. Por ejemplo, "cargue el REPL y escriba (load-file" this-or-that ") para ejecutar. Esto está bien, pero no es suficiente.

Estoy tan acostumbrado a los lenguajes de edición y compilación de lenguajes como C o Delphi, que instintivamente me veo obligado a hacer ediciones, luego presiono "Mx compile".

El problema es que "lein uberjar", que entiendo es el equivalente a "hacer", es muy lento de ejecutar incluso para un mundo de hola. Así que voy a tener que descubrir cómo funciona este "desarrollo interactivo", dejar de usar el uberjar como si fuera una marca rápida, y guardarlo solo para el final del día.

Otra cosa que noté al construir (usando lein uberjar) es que la pequeña aplicación GUI en la que estoy trabajando muestra marcos en el proceso de compilación, como si se estuvieran ejecutando durante la compilación. Simplemente parece un poco contradictorio para mí; no es tan análogo a "hacer" como yo había pensado.

Sé que la manera de Lisp de desarrollar cosas está trabajando de manera interactiva en el REPL, y no estoy tratando de cambiar eso: me gustaría adaptarme a esta forma de vida. Lamentablemente, he visto poco en forma de documentación sobre cómo hacerlo. Por ejemplo, cómo restablecer el estado actual de la máquina. Simplemente parece un poco complicado seguir compilando fragmentos individuales sobre la marcha sin poder hacer algún tipo de reinicio.

La mayoría de los tutoriales que he visto en Clojure (y Lisp) en general parecen centrarse en piratear el REPL. Las mejores prácticas en el despliegue de aplicaciones siguen siendo un misterio para mí. Mis usuarios solo serán usuarios; no van a ser desarrolladores que van a cargar archivos en un REPL.

Así que aquí está mi pregunta: ¿algún recurso para obtener buena información o tutoriales sobre todo el proceso de creación de una aplicación Clojure, incluida la implementación?

(Nota: Tengo todos los requisitos previos instalados y en funcionamiento (por ejemplo, Emacs, Slime, Leiningen, etc.), así que no se trata de eso).


Un par de pistas rápidas, luego algunos enlaces:

No use lein uberjar durante el desarrollo; Prefiero lein jar La diferencia es que lein uberjar coloca todas sus dependencias en el contenedor generado (incluido Clojure), de modo que su único contenedor sea un paquete completamente independiente con su aplicación dentro; lein jar solo crea tu propio código. El enfoque uberjar tiene beneficios obvios para la implementación, pero para el desarrollo, debería poder usar la ruta de clases apropiada al ejecutar su aplicación, ahorrándose el tiempo necesario para preparar un uberjar. Si no desea administrar manualmente el classpath para ejecuciones de prueba, revise el plugin lein run .

Además, lo más probable es que la mayoría de tu código no se compile realmente en AOT. AOT es necesario en algunos escenarios de interoperabilidad de Java, pero la mayoría de las veces trae un pequeño aumento en la velocidad de inicio y problemas molestos con la compatibilidad binaria con diferentes lanzamientos de Clojure. Supongo que este último problema no es relevante para un tipo de proyecto de aplicación independiente uberjar -ed, pero cualquier código de biblioteca al menos debería dejarse ser JIT-ed si es posible. Con Leiningen, puede poner una cláusula :namespaces en el formulario de defproject en project.clj para determinar qué espacios de nombres se compilarán; lo que sea que dejes afuera estará actualmente JIT-ed por defecto. Las versiones anteriores de Leiningen solían compilar todo de manera predeterminada, ¡lo que en realidad es una buena razón para actualizar!

En cuanto a las ventanas que aparecen durante la compilación, supongo que está ejecutando código de ventana emergente durante el tiempo de expansión de macro o fuera de cualquier definición de función o construcción similar. (Algo así como (println "Foo!") En el nivel superior.) Eso es algo que no deberías hacer, supongo, a menos que planees ejecutar tu código como un guión, de todos modos. Para evitar el problema, ajuste el código de efecto secundario en las definiciones de función y proporcione un punto de entrada a su aplicación utilizando la cláusula :main en project.clj . (Si dices :main foo , entonces la función -main del espacio de nombres foo se usará como el punto de entrada a tu aplicación. De todos modos, esa es la configuración predeterminada, y al menos la lein run mencionada anteriormente parece tener el nombre codificado de forma rígida: no estoy seguro acerca de si mismo)

En cuanto a restablecer el estado de REPL, puede simplemente reiniciarlo. Con SLIME, Mx slime-restart-inferior-lisp hará exactamente eso mientras mantiene el resto del estado de su sesión de Emacs.

Ver también estas discusiones en el grupo Clojure Google:

  1. Clojure para la administración del sistema
  2. Preparando clojure para el empaquetado (fue: Re: Clojure para la administración del sistema)
  3. Leiningen, Clojure y las bibliotecas: ¿qué me estoy perdiendo?