Esta aplicación es una variante despojada del proyecto USERMANAGER-Ejemplo de Sean Corfield (sincronizado a partir de Commit SHA 2A9CF63).
El proyecto de ejemplo original de "Administrador de usuarios" de Sean y sus variantes (incluida esta), tienen como objetivo desmitificar "¿Cómo construir una aplicación web Clojure usando solo bibliotecas?" .
La "composición sobre la herencia", las "bibliotecas sobre los marcos" y la característica de "orientación de datos" prominentemente en el modelo de programación mental canónico del mundo de Clojure, incluida la programación de la Web. En ausencia, algunas de estas intuiciones clave, incluso los desarrolladores experimentados que son nuevos en Clojure tienden a luchar para construir aplicaciones utilizando bibliotecas. El colectivo "Administrador de usuarios" de las demostraciones tiene como objetivo abordar este desafío específico. No aspiran a enseñar las mejores prácticas del desarrollo web. Para ese fin, todos los ejemplos de "Administrador de usuarios" son aplicaciones de estilo "Web 1.0" pequeñas, simplificadas.
Este proyecto se expande en el imprimador "De los primeros principios" que escribí en " Clojuring the Web Application Pitch: Meditation One ". Elegí usar la aplicación de demostración original de Sean como especificación porque:
Si nada más, existe para rascar la propia picazón ... Me gustan las explicaciones de Barebones y el amor de ir a bajar "Espera, pero ¿por qué?" Agujas y tangentes de conejo.
Verá, todas las otras demostraciones de "Administrador de usuarios", aunque simples, están construidas con bibliotecas utilizadas por profesionales de Clojure en aplicaciones web de producción del mundo real. Entonces, si las bibliotecas son un precursor de la pila web (personalizada) de uno (o marco) ... ¿Cuál sería el precursor de las bibliotecas? No hay bibliotecas :)
Mantenga a mano el administrador de usuarios original "y mi publicación de blog, para referencia de lado a lado mientras trabaja a través de esta base de código.
Si algo no está claro, o por error, no dude en abrir un problema (pero no cambie la estructura del código).
Lo he creado para ayudar al lector a observar el "fabricación" de la aplicación. Consulte el ReadMe a partir del compromiso en cuestión de las instrucciones de uso relevantes para ese punto en el desarrollo.
Creo que aprendemos mejor pasando progresivamente de modelos mentales de grano grueso aproximado a los de alta fidelidad. Como tal, algunas simplificaciones deliberadas pueden molestar a los profesionales web (como usar GOT ToLete). Uno confía en los alumnos para recoger las formas "correctas" de hacer las cosas del total de su total de sus estudios, experimentos, colegas y mentores.
Al aprender, a veces es bueno estar inquieto;)
Qué esperar, si trabaja desde el primer compromiso:
curl a la aplicación. curl localhost:3000
curl -XPOST localhost:3000/some/path?q=somethingsomething
curl -XDELETE localhost:3000/foo/bar/baz
usermanager.main siempre debe tener una forma actual de comenzar/detener el proceso del servidor (y/o estado actual de la aplicación).usermanager.* , Es una pista.usermanager.main debe aliviar la restauración de su servidor, después de reiniciar el repl.dev/ directorio del proyecto (es posible que tenga que crearlo manualmente).department y addressbook ).dev ...Como mencioné, he restado tantas bibliotecas como pude, sin comprometer la fidelidad con el diseño del proyecto original. La excepción es que cualquier forma de interoperabilidad entre nuestra aplicación web y el mundo exterior. He asumido soluciones (bibliotecas) preexistentes para esas necesidades (¡tengo que dibujar un límite en algún lugar!). También algunas utilidades de confort de criaturas que no son fundamentales para el tema de esta explicación de los primeros principios.
Regreso a la publicación del blog para obtener una mejor imagen de dónde y por qué he dibujado este límite.
Específicamente, he usado:
Para mantenerse fiel a la especificación de Sean para la API, el modelo de dominio de USERMANAGER, y la "lógica comercial" central, tengo partes de su fuente de ejemplo usermanager:
Para reforzar la idea de componer piezas móviles utilizando datos de Clojure lisos, he creado mi código para usar las opciones de diseño hechas por Sean (por ejemplo, inyectando el nombre de la vista en el contexto de solicitud, para su uso posterior mediante la lógica de renderizado HTML). Del mismo modo, para mantenerse fiel a la especificación del anillo, todas las utilidades de anillo autoescritos y el middleware siguen la especificación del anillo. Reemplazarlos con originales proporcionados por anillo debe ser sencillo.
Si elige escribir su propia variante, sugiero seguir su ejemplo.
Ahora debería ser obvio, pero lo indicaré de todos modos ... La aplicación despojada no es en absoluto robusta a las demandas del mundo real porque omite casi todas las bibliotecas utilizadas por los otros ejemplos de "administrador de usuarios", que hacen todo el trabajo pesado de "grado de producción" para nosotros. Incluso esas aplicaciones necesitarán algo de trabajo en ellas (revisiones de diseño, pruebas de integración, verificaciones de seguridad, etc.), si van a calificar para la implementación del mundo real.
Igual que el proyecto de ejemplo USERMANAGER de Sean.
deps.edn .tools.build para usar comandos desde el archivo build.clj . Se incluye a través del :build Alias del archivo deps.edn . Los proyectos de uso de Clojure-Cli utilizan dicho archivo build.clj por convención, para proporcionar funcionalidad de compilación de proyectos estándar y personalizada. Proyecto de herramientas de configuración del esqueleto generalmente genere automáticamente este archivo. Lo he copiado del proyecto de Sean. Clonar el repositorio, cd en él, luego siga cualquiera de los métodos a continuación para probar la aplicación y/o implementarla. Tenga en cuenta que la aplicación resultante no es adecuada para la implementación de producción. Siéntase libre de implementarlo, por supuesto, pero exponerlo a Internet público solo en una instancia de servidor desechable.
Ejecute las pruebas de esta manera, desde la raíz del proyecto.
clojure -T:build test
Esto utiliza el alias :build para cargar el archivo build.clj , basado test tools.build .
¡Ojalá pasen las pruebas! Deberías ver algo como esto:
Running tests in #{"test"}
[ Many lines of test runner log messages. ]
Ran 11 tests containing 37 assertions.
0 failures, 0 errors.
Nota sobre los mensajes de registro:
Puede ejecutar la aplicación en cualquier momento de la historia de confirmación de este proyecto. Sin embargo , la funcionalidad disponible solo coincidirá con lo que se construya con ese compromiso.
Inicie la aplicación y apunte su navegador a http: // localhost: 3000.
clojure -M -m usermanager.main
Si ese puerto está en uso, comience en un puerto diferente. Por ejemplo, puerto 3100:
clojure -M -m usermanager.main 3100
Comienza
clj -M:dev:test
Una vez que se inicia replica, inicie el servidor en el puerto predeterminado (puerto 3000):
user=> ( require 'usermanager.main) ; load the code
user=> ( in-ns 'usermanager.main) ; move to the namespace
usermanager.main=> ( -main ) ; or some other port (-main 8080)Apunte su navegador a la URL apropiada http: // localhost: portnumber.
Use el dev y los perfiles test cuando ejecute el replica, ya sea independiente o a través de su editor favorito.
Entonces, eval/aplique lejos!
Para la implementación del servidor, generalmente desea construir un archivo "Uberjar" -un archivo .jar que contenga a Clojure y todo el código de su aplicación y sus dependencias, para que pueda ejecutarlo con el comando java -jar . (Pero como dije anteriormente, este proyecto no es el software de producción. Así que implementa solo en entornos de servidor desechables).
El archivo build.clj , mencionado anteriormente, contiene una tarea ci que:
target.jar independiente clojure -T:build ci
Eso debería producir la misma salida que test anterior, seguida de algo como:
Copying source...
Compiling usermanager.main...
Building JAR...
La carpeta target se creará si no existe e incluirá una carpeta classes que contenga todo el código fuente compilado de Clojure de la aplicación usermanager y todas sus dependencias, incluida la propia Clojure:
ls target/classes/
hiccup hiccup2 public ring usermanager
También incluirá el archivo .jar independiente que puede ejecutar así:
java -jar target/usermanager/example-standalone.jar
Esto debería comportarse lo mismo que el ejemplo de la aplicación anterior.
Este archivo JAR se puede implementar en cualquier servidor que tenga Java instalado y ejecutado sin otras dependencias o archivos externos.
Podría demostrar cómo reemplazar cada pieza de mano con las bibliotecas de producción de Clojure.
¡Pero tal vez puedas hacerlo en tus propias palabras, como tarea autoasignada! :)
Compare y contrasta con esos otros proyectos de ejemplo usermanager, para obtener pistas.
¡Que la fuente esté contigo!
Copyright (c) 2015-2024 Sean Corfield. Copyright (c) 2024 Aditya Athalya.
Distribuido bajo la licencia fuente de Apache 2.0.