Cette application est une variante dépouillée du projet d'exemple Usermanager de Sean Corfield (synchronisé à partir de Commit Sha 2A9CF63).
L'exemple d'origine du projet "User Manager" de Sean et ses variantes (y compris celui-ci) visent à démystifier "Comment construire une application Web Clojure en utilisant uniquement des bibliothèques?" .
"Composition sur l'héritage", "bibliothèques sur les frameworks" et "orientation des données" se présentent en bonne place dans le modèle mental canonique de la programmation du monde de Clojure, y compris la programmation du Web. En l'absence de certaines de ces intuitions clés, même les développeurs expérimentés qui sont nouveaux à Clojure ont tendance à lutter pour créer des applications à l'aide de bibliothèques. Le collectif "User Manager" des démos vise à relever ce défi spécifique. Ils n'aspirent pas à enseigner les meilleures pratiques du développement Web. À cette fin, tous les exemples de "gestionnaire d'utilisateurs" sont de petites applications de style "Web 1.0" simplifiées.
Ce projet développe l'amorce "From First Principles" que j'ai notée dans " Clojuring the Web Application Stack: Meditation One ". J'ai choisi d'utiliser l'application de démonstration originale de Sean comme spécification car:
Si rien d'autre, il existe pour gratter ses propres démangeaisons ... j'aime les explications nus et j'adore descendre "attendez, mais pourquoi?" trous de lapin et tangentes.
Vous voyez, toutes les autres démos "Manager d'utilisateurs", bien que simples, sont construites avec des bibliothèques utilisées par les professionnels de Clojure dans des applications Web de production réelle. Donc, si les bibliothèques sont un précurseur de sa pile Web (ou un cadre) (ou un cadre) ... quel serait le précurseur des bibliothèques? Pas de bibliothèques :)
Gardez à portée de main le gestionnaire d'utilisateurs d'origine "et mon article de blog, pour référence côte à côte lorsque vous travaillez via cette base de code.
Si quelque chose n'est pas clair ou par erreur, n'hésitez pas à ouvrir un problème (mais veuillez ne pas modifier la structure du code).
Je l'ai conçu pour aider le lecteur à observer la "Making" de l'application pièce par pièce. Consultez le ReadMe à partir de la commission en question pour des instructions d'utilisation pertinentes à ce point de développement.
Je pense que nous apprenons mieux en passant progressivement de modèles mentaux à grain grossier approximatifs à des modèles mentaux à haute fidélité. En tant que tels, certaines simplifications délibérées peuvent agacer les professionnels du Web (comme utiliser GET à supprimer). L'un des apprenants fait confiance pour récupérer les «bonnes» façons de faire les choses de la somme totale de leurs études, expériences, collègues et mentors.
Lors de l'apprentissage, il est parfois bon d'être agité;)
À quoi s'attendre, si vous travaillez à partir du tout premier engagement:
curl à l'application. curl localhost:3000
curl -XPOST localhost:3000/some/path?q=somethingsomething
curl -XDELETE localhost:3000/foo/bar/baz
usermanager.main doit toujours avoir un moyen actuel comme le engagement de démarrer / d'arrêter le processus du serveur (et / ou l'état actuel de l'application).usermanager.* Espace de noms, c'est un indice.usermanager.main devraient faciliter la restauration de votre serveur, après avoir redémarré le REP.dev/ du projet (vous devrez peut-être le créer manuellement).department et addressbook ).dev ...Comme je l'ai mentionné, j'ai soustrait autant de bibliothèques que possible, sans compromettre la fidélité à la conception du projet d'origine. L'exception est que toute forme d'hôte interoppe entre notre application Web et le monde extérieur. J'ai supposé des solutions préexistantes (bibliothèques) pour ces besoins (je dois tracer une frontière quelque part!). De plus, certains utilitaires de confort de créature qui ne sont pas au cœur du thème de cette explication des premiers principes.
Revenez à l'article de blog pour obtenir une meilleure image de l'endroit où et pourquoi j'ai tracé cette frontière.
Plus précisément, j'ai utilisé:
Pour rester fidèle aux spécifications de Sean pour l'API de l'Usermanager, le modèle de domaine et la «logique commerciale» de base, j'ai des parties copiées directement de sa source d'exemple de usermanager:
Pour renforcer l'idée de composer des pièces mobiles à l'aide de données Clojure, j'ai conçu mon code pour utiliser les choix de conception faits par Sean (par exemple, injecter le nom de la vue dans le contexte de la demande, pour une utilisation ultérieure par HTML Rending Logic). De même, pour rester fidèle à la spécification de l'anneau, tous les utilitaires et middleware auto-écrits suivent la spécification de la bague. Les remplacer par des originaux fournis à l'anneau devrait être simple.
Si vous choisissez d'écrire votre propre variante, je vous suggère de suivre le costume.
Cela devrait être évident maintenant, mais je le dirai de toute façon ... l'application dépouillée n'est pas du tout robuste aux exigences du monde réel car il omet presque toutes les bibliothèques utilisées par les autres exemples de "gestionnaire d'utilisateurs", qui font tous les levés lourds de la "qualité de production" pour nous. Même ces applications auront besoin de travaux effectués sur eux (avis de conception, tests d'intégration, chèques de sécurité, etc.), s'ils veulent se qualifier pour le déploiement du monde réel.
Identique au projet d'exemple Usermanager de Sean.
deps.edn .tools.build pour utiliser les commandes à partir du fichier build.clj . Il est inclus via :build Alias du fichier deps.edn . Les projets de Clojure-Cli-Using utilisent un tel fichier build.clj par convention, pour fournir des fonctionnalités de build de projet standard et personnalisées. Projet Les outils de configuration du squelette génèrent généralement ce fichier. Je l'ai copié à partir du projet de Sean. Clone le repo, cd , puis suivez l'une des méthodes ci-dessous pour essayer l'application et / ou le déployer. Notez que l'application résultante n'est pas adaptée au déploiement de la production. N'hésitez pas à le déployer, bien sûr, mais exposez-le à Internet public uniquement sur une instance de serveur jetable.
Exécutez les tests de cette façon, à partir de la racine du projet.
clojure -T:build test
Cela utilise l'alias :build pour charger le fichier build.clj , en fonction tools.build , et exécutez la tâche test .
Espérons que les tests passent! Vous devriez voir quelque chose comme ceci:
Running tests in #{"test"}
[ Many lines of test runner log messages. ]
Ran 11 tests containing 37 assertions.
0 failures, 0 errors.
Remarque sur les messages du journal:
Vous pouvez exécuter l'application à tout moment de l'histoire de la validation de ce projet. Cependant , les fonctionnalités disponibles ne correspondront que ce qui est accumulé à cet engagement.
Démarrez l'application et pointez votre navigateur sur http: // localhost: 3000.
clojure -M -m usermanager.main
Si ce port est utilisé, démarrez-le sur un autre port. Par exemple, port 3100:
clojure -M -m usermanager.main 3100
Démarrer les réponses
clj -M:dev:test
Une fois le REPD démarré, démarrez le serveur sur le port par défaut (port 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)Pointez votre navigateur vers l'URL appropriée http: // localhost: Portnumber.
Utilisez les profils dev et test lorsque vous exécutez le REP, qu'ils soient autonomes ou via votre éditeur préféré.
Ensuite, évaluez / appliquez!
Pour le déploiement du serveur, vous souhaitez généralement créer un «Uberjar» - un fichier .jar qui contient Clojure lui-même et tout le code de votre application et de ses dépendances, afin que vous puissiez l'exécuter avec la commande java -jar . (Mais comme je l'ai dit plus tôt, ce projet n'est pas un logiciel de production. Donc, déployez-le uniquement dans des environnements de serveurs jetables.)
Le fichier build.clj - mentionné ci-dessus - contient une tâche ci qui:
target.jar autonome clojure -T:build ci
Cela devrait produire la même sortie que test ci-dessus, suivi de quelque chose comme:
Copying source...
Compiling usermanager.main...
Building JAR...
Le dossier target sera créé s'il n'existe pas et il inclura un dossier classes contenant tout le code source Clojure compilé à partir de l'application usermanager et toutes ses dépendances, y compris Clojure lui-même:
ls target/classes/
hiccup hiccup2 public ring usermanager
Il comprendra également le fichier .jar autonome que vous pouvez exécuter comme ceci:
java -jar target/usermanager/example-standalone.jar
Cela devrait se comporter de la même manière que l'exemple d'exécution de l'application ci-dessus.
Ce fichier JAR peut être déployé sur n'importe quel serveur installé Java et exécuté sans autres dépendances ou fichiers externes.
Je pourrais démontrer comment remplacer chaque pièce louée à la main à l'aide de bibliothèques Clojure de production.
Mais peut-être que vous pouvez le faire dans vos propres mots, comme des devoirs auto-affaiblis! :)
Comparez et contrastez avec ces autres projets d'exemple de usermanager, pour des indices.
Que la source soit avec vous!
Copyright (C) 2015-2024 Sean Corfield. Copyright (C) 2024 Aditya Athalye.
Distribué sous la licence APAChe Source 2.0.