Diese App ist eine abgespeckte Variante des UserManager-Beispielprojekts von Sean Corfield (synchronisiert nach SHA 2A9CF63).
Das ursprüngliche "User Manager" -Pilzprojekt von Sean und seine Varianten (einschließlich dieser) zielen darauf ab, zu entmystifizieren. "Wie man eine Clojure -Webanwendung mit nur Bibliotheken erstellt?" .
"Komposition über die Vererbung", "Bibliotheken über Frameworks" und "Datenorientierung" sind im kanonischen mentalen Programm der Clojure -Welt, einschließlich Programmierung des Webs, prominent zu sehen. Fehlen einige dieser wichtigsten Intuitionen, selbst erfahrene Entwickler, die neu in Clojure sind, neigen dazu, mit Bibliotheken Apps zu bauen. Das "User Manager" -Kollektiv von Demos zielt darauf ab, diese spezifische Herausforderung zu befriedigen. Sie streben nicht an, Best Practices der Webentwicklung zu unterrichten. Zu diesem Zweck sind alle Beispiele "User Manager" kleine, vereinfachte "Web 1.0" -Stil -Apps.
Dieses Projekt erweitert den "Aus der ersten Prinzipien", die ich in " Clojuring the Web Application Stack: Meditation One " aufgeschrieben habe. Ich habe mich für die ursprüngliche Demo -App von Sean als Spezifikation entschieden, weil:
Wenn nichts anderes, existiert es, seinen eigenen Juckreiz zu kratzen ... Ich mag Barebones Erklärungen und liebe es, "Warte, aber warum?" Kaninchenlöcher und Tangenten.
Sie sehen, dass alle anderen "User Manager" -Demos, obwohl er einfach ist, mit Bibliotheken erstellt werden, die von Clojure-Profis in realen Produktions-Web-Apps verwendet werden. Also, wenn Bibliotheken ein Vorläufer des (benutzerdefinierten) Webstacks (oder Framework) sind ... Was wäre der Vorläufer für Bibliotheken? Keine Bibliotheken :)
Halten Sie den ursprünglichen User Manager und meinen Blog-Beitrag zur Seite an Seite, wenn Sie diese Codebasis durcharbeiten.
Wenn etwas unklar oder fehlerhaft ist, können Sie bitte ein Problem öffnen (ändern Sie jedoch nicht die Struktur des Codes).
Ich habe es so gestaltet, dass der Leser das Stück "Making-of" der App beobachtet hat. Wenden Sie sich an die Readme als des fraglichen Commits für die für diesen Punkt in der Entwicklung relevante Nutzungsanweisungen.
Ich denke, wir lernen besser, indem wir von ungefähr grobkörnigen mentalen Modellen bis hin zu hohen Zunahme überschreiten. Daher können einige absichtliche Vereinfachungen Web -Profis ärgern (wie die Verwendung von Get to Delete). Man vertraut den Lernenden darauf, die "richtigen" Wege aufzunehmen, um Dinge aus der Summe ihrer Studien, Experimente, Kollegen und Mentoren zu tun.
Beim Lernen ist es manchmal gut, unruhig zu sein;)
Was zu erwarten ist, wenn Sie vom allerersten Commit sich vorantreiben:
curl -Anfragen an die App auszustellen. curl localhost:3000
curl -XPOST localhost:3000/some/path?q=somethingsomething
curl -XDELETE localhost:3000/foo/bar/baz
usermanager.main sollte immer eine aktuelle Möglichkeit haben, den Serverprozess (und/oder den aktuellen Status der App) zu starten/zu stoppen.usermanager.* Namespace, das ist ein Hinweis.usermanager.main sollte die Wiederherstellung Ihres Servers erleichtern, nachdem Sie die Replay neu gestartet haben.dev/ Verzeichnis des Projekts (Sie müssen es möglicherweise manuell erstellen).department und addressbook ) füllen.dev abzufragen/zu ändern/zu überprüfen ...Wie ich bereits erwähnt habe, habe ich so viele Bibliotheken wie möglich abgezogen, ohne die Treue zum Design des ursprünglichen Projekts zu beeinträchtigen. Die Ausnahme ist jede Form des Host -Interops zwischen unserer Web -App und der Außenwelt. Ich habe bereits vorhandene Lösungen (Bibliotheken) für diese Bedürfnisse angenommen (ich muss irgendwo eine Grenze ziehen!). Auch einige Komfort-Dienstprogramme für Kreaturen, die für das Thema dieser Erklärung der ersten Prinzipien nicht von zentraler Bedeutung sind.
Hark zurück zum Blog -Beitrag, um ein besseres Bild davon zu machen, wo und warum ich diese Grenze gezogen habe.
Insbesondere habe ich verwendet:
Um Seans Spezifikation für die API von UserManager, Domainmodell und Core "Business Logic" treu zu bleiben, habe ich Teile seiner UserManager-Example-Quelle geradeausgeführt:
Um die Idee zu verstärken, bewegliche Teile mit einfachen Clojure -Daten zu komponieren, habe ich meinen Code so gestaltet, dass sie die von Sean getroffenen Designoptionen verwenden (z. B. den Namen der Ansicht im Anforderungskontext für die spätere Verwendung durch HTML -Rendering -Logik). Um der Ringspezifikation treu zu bleiben, folgen alle selbst geschriebenen Ring-Dienstprogramme und Middleware der Ringspezifikation. Das Ersetzen durch ringbereitete Originale sollte unkompliziert sein.
Wenn Sie Ihre eigene Variante schreiben, schlage ich vor, dem Anzug zu folgen.
Es sollte inzwischen offensichtlich sein, aber ich werde es trotzdem sagen ... Die abgespeckte App ist überhaupt nicht robust für die realen Anforderungen, da sie fast alle Bibliotheken, die von den anderen "Benutzermanager" -Beibilder verwendet werden, ausgelassen wird, die alle für uns schwere Heben von "Produktionsstufen" ausführen. Sogar diese Apps benötigen einige Arbeiten daran (Entwurfsbewertungen, Integrationstests, Sicherheitskontrollen usw.), wenn sie sich für eine reale Bereitstellung qualifizieren sollen.
Gleich wie Seans UserManager-Example-Projekt.
deps.edn -Datei bereitstellen.tools.build -Bibliothek verwenden Befehle aus der Datei build.clj . Es ist über den :build von Alias der deps.edn -Datei enthalten. Clojure-Cli-Us-Projekte verwenden eine solche build.clj Datei nach Konvention, um Standard- und benutzerdefinierte Projektbuild-Funktionen bereitzustellen. Project Skeleton Setup Tools generieren diese Datei in der Regel automatisch. Ich habe es aus Seans Projekt kopiert. Klonen Sie das Repo, cd hinein, befolgen Sie die folgenden Methoden, um die App auszuprobieren und/oder bereitzustellen. Beachten Sie, dass die resultierende App nicht für die Produktionsbereitstellung geeignet ist. Fühlen Sie sich natürlich gerne bereit, es bereitzustellen, aber sie dem öffentlichen Internet nur in einer Wurf -Server -Instanz auszusetzen.
Führen Sie die Tests auf diese Weise aus der Wurzel des Projekts aus.
clojure -T:build test
Dadurch wird der :build -Alias zum Laden der build.clj -Datei basierend auf tools.build verwendet und die test ausgeführt.
Hoffentlich gehen die Tests bestehen! Sie sollten so etwas sehen:
Running tests in #{"test"}
[ Many lines of test runner log messages. ]
Ran 11 tests containing 37 assertions.
0 failures, 0 errors.
Hinweis zu den Protokollnachrichten:
Sie können die App zu jedem Zeitpunkt in der Commit -Geschichte dieses Projekts ausführen. Die verfügbaren Funktionen stimmen jedoch nur mit dem überein, was zu diesem Vergehen aufgebaut wird.
Starten Sie die App und richten Sie Ihren Browser auf http: // localhost: 3000.
clojure -M -m usermanager.main
Wenn dieser Port verwendet wird, starten Sie ihn auf einem anderen Port. Zum Beispiel Port 3100:
clojure -M -m usermanager.main 3100
Starten Sie die Repl
clj -M:dev:test
Starten Sie den Server nach dem Start von Repl auf den Standardport (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)Zeigen Sie Ihren Browser auf die entsprechende URL http: // localhost: portnumber.
Verwenden Sie die dev und test , wenn Sie die Reply ausführen, ob eigenständig oder über Ihren Lieblingsredakteur.
Dann bewerten/bewerben Sie sich!
Für die Serverbereitstellung möchten Sie normalerweise eine "Uberjar" erstellen -eine .jar -Datei, die Clojure selbst und den gesamten Code aus Ihrer Anwendung und ihren Abhängigkeiten enthält, damit Sie ihn mit dem Befehl java -jar ausführen können. (Aber wie ich bereits erwähnt habe, handelt es sich bei diesem Projekt um keine Produktionssoftware. Bereitstellen Sie es also nur für Wurf -Serverumgebungen bereit.)
Die oben erwähnte build.clj -Datei enthält eine ci -Aufgabe, die:
target.jar -Datei clojure -T:build ci
Das sollte den gleichen Ausgang wie der obige test erzeugen, gefolgt von so etwas wie:
Copying source...
Compiling usermanager.main...
Building JAR...
Der target wird erstellt, wenn es nicht vorhanden ist, und enthält einen classes , der alle kompilierten Clojure -Quellcode aus der usermanager -Anwendung und alle Abhängigkeiten einschließlich der Clojure selbst enthält:
ls target/classes/
hiccup hiccup2 public ring usermanager
Es wird auch die eigenständige .jar -Datei enthalten, die Sie so ausführen können:
java -jar target/usermanager/example-standalone.jar
Dies sollte sich genauso verhalten, wie es im obigen Anwendungsbeispiel ausgeführt wird .
Diese JAR -Datei kann an jedem Server bereitgestellt werden, auf dem Java installiert ist und ohne andere externe Abhängigkeiten oder Dateien ausgeführt wird.
Ich könnte demonstrieren, wie man jedes handgeschnittene Stück mit Produktionsclojure-Bibliotheken ersetzt.
Aber vielleicht können Sie es in Ihren eigenen Worten als selbst zugewiesene Hausaufgaben tun! :)
Vergleichen und im Gegensatz zu diesen anderen UserManager-Beispielprojekten für Hinweise.
Möge die Quelle mit Ihnen sein!
Copyright (C) 2015-2024 Sean Corfield. Copyright (C) 2024 Aditya Athalye.
Unter der Apache Source -Lizenz 2.0 verteilt.