هذا التطبيق عبارة عن متغير تجريد من مشروع مثال Sean Corfield's Usermanager (تمت مزامنته على أنه من الالتزام بـ SHA 2A9CF63).
يهدف مشروع مثال "مدير المستخدم" الأصلي لشون ومتغيراته (بما في ذلك هذا واحد) إلى إزالة الغموض عن "كيفية إنشاء تطبيق ويب clojure باستخدام المكتبات فقط؟" .
"التكوين على الميراث" ، و "المكتبات على الأطر" ، و "اتجاه البيانات" ميزة بارزة في النموذج العقلي الكنسي في العالم ، بما في ذلك برمجة الويب. في غياب بعض هذه الحدس الرئيسي ، حتى المطورين ذوي الخبرة الذين يعانون من جدد في Clojure يميلون إلى الكفاح من أجل بناء التطبيقات باستخدام المكتبات. تهدف "مدير المستخدم" الجماعي للعروض التجريبية إلى مواجهة هذا التحدي المحدد. إنهم لا يطمحون إلى تعليم أفضل الممارسات لتطوير الويب. تحقيقًا لهذه الغاية ، تكون جميع أمثلة "Manager Manager" صغيرة ، مبسطة ، "Web 1.0" تطبيقات نمط.
يتوسع هذا المشروع على التمهيدي "من المبادئ الأولى" التي كتبتها في " Clojuging the Web Application Cacket: Meditation One ". اخترت استخدام تطبيق Sean التجريبي الأصلي كمواصفات لأن:
إذا لم يكن هناك شيء آخر ، فهو موجود في خدش الحكة الخاصة ... أحب تفسيرات العاري والحب النزول "انتظر ، ولكن لماذا؟" ثقوب الأرنب والشفان.
ترى ، يتم تصميم جميع عروض "مدير المستخدم" الأخرى ، على الرغم من أنها بسيطة ، مع المكتبات التي يستخدمها محترفي Clojure في تطبيقات الويب الخاصة بالإنتاج في العالم الحقيقي. لذلك ، إذا كانت المكتبات هي مقدمة لمكدس الويب (المخصص) (أو إطار عمل) ... ما هو السلائف للمكتبات؟ لا توجد مكتبات :)
احتفظ بمدير المستخدم الأصلي "، ونشر مدونتي ، للمرجع جنبًا إلى جنب أثناء عملك من خلال قاعدة الشفرة هذه.
إذا كان أي شيء غير واضح ، أو عن طريق الخطأ ، فلا تتردد في فتح مشكلة (ولكن من فضلك لا تغير هيكل الرمز).
لقد قمت بصياغةها لمساعدة القارئ على مراقبة "صنع" التطبيق على قدم وساق. راجع README اعتبارًا من الالتزام المعني بتعليمات الاستخدام ذات الصلة بهذه النقطة في التطوير.
أعتقد أننا نتعلم بشكل أفضل من خلال الانتقال تدريجياً من النماذج العقلية التقريبية الحبيبية إلى النماذج العالية. على هذا النحو ، قد تزعج بعض عمليات التبسيط المتعمدة متخصصي الويب (مثل استخدام Get to Delete). يثق المرء في المتعلمين لالتقاط الطرق "الصحيحة" للقيام بأشياء من مجموع دراساتهم وتجاربهم وزملاؤهم والموجهين.
عند التعلم ، من الجيد أحيانًا أن تكون مضطربًا ؛)
ما يمكن توقعه ، إذا كنت تعمل إلى الأمام من الالتزام الأول:
curl إلى التطبيق. curl localhost:3000
curl -XPOST localhost:3000/some/path?q=somethingsomething
curl -XDELETE localhost:3000/foo/bar/baz
usermanager.main دائمًا على طريقة حالية لبدء/إيقاف عملية الخادم (و/أو الحالة الحالية للتطبيق).usermanager.* مساحة الاسم ، فهذه فكرة.usermanager.main تخفيف استعادة الخادم الخاص بك ، بعد إعادة تشغيل الاستبدال.dev/ دليل المشروع (قد تضطر إلى إنشائه يدويًا).department وكتاب addressbook ).dev ...كما ذكرت ، لقد قمت بطرح أكبر عدد ممكن من المكتبات ، دون المساس بالإخلاص لتصميم المشروع الأصلي. الاستثناء هو أن أي شكل من أشكال interop المضيف بين تطبيق الويب الخاص بنا والعالم الخارجي. لقد افترضت حلولًا موجودة مسبقًا (المكتبات) لتلك الاحتياجات (لا بد لي من رسم حدود في مكان ما!). أيضا بعض مرافق الراحة المخلوق التي ليست أساسية لموضوع هذا التفسير الأول.
عاد Hark إلى منشور المدونة للحصول على صورة أفضل لمكان ولماذا قمت برسم هذه الحدود.
على وجه التحديد ، لقد استخدمت:
للحفاظ على مواصفات Sean لمواصفات API الخاصة بـ Usermanager ، ونموذج المجال ، و "منطق الأعمال" الأساسي ، لدي أجزاء مستقيمة من مصدره في حالة USERMANAGER:
لتعزيز فكرة تكوين أجزاء متحركة باستخدام بيانات clojure العادية ، قمت بصياغة الكود الخاص بي لاستخدام خيارات التصميم التي تم إجراؤها بواسطة Sean (مثل حقن اسم العرض في سياق الطلب ، للاستخدام لاحقًا بواسطة منطق تقديم HTML). وبالمثل ، للبقاء وفيا لمواصفات الحلقة ، تتبع جميع الأدوات المساعدة الدائرية المكتوبة ذاتيا ووسائط الوسيطة مواصفات الحلقة. يجب أن يكون استبدالها بأصول أصلية مقدمة من الحلقة واضحة.
إذا اخترت كتابة المتغير الخاص بك ، أقترح اتباع حذو.
يجب أن يكون الأمر واضحًا الآن ، لكنني سأذكر ذلك على أي حال ... التطبيق الذي تم تجريده ليس قويًا على الإطلاق لمطالب العالم الحقيقي لأنه يحذف جميع المكتبات التي تستخدمها "مدير المستخدم" الآخر تقريبًا ، والتي تفعل كل "درجة الإنتاج" الثقيلة بالنسبة لنا. حتى هذه التطبيقات ستحتاج إلى بعض الأعمال المنجزة عليها (مراجعات التصميم ، واختبار التكامل ، وفحوصات الأمان ، وما إلى ذلك) ، إذا أرادت التأهل لنشر العالم الحقيقي.
مثل مشروع مثال Sean's Usermanager-example.
deps.edn .tools.build Library لاستخدام الأوامر من ملف build.clj . يتم تضمينه عبر :build الاسم المستعار لملف deps.edn . تستخدم مشاريع استخدام Clojure-Cli-using ملف build.clj حسب الاتفاقية ، لتوفير وظائف بناء المشروع القياسية والمخصصة. أدوات إعداد الهيكل العظمي للمشروع عادة ما تكون تلقائيًا هذا الملف. لقد قمت بنسخه من مشروع شون. استنساخ الريبو ، cd فيه ، ثم اتبع أيًا من الطرق أدناه لتجربة التطبيق و/أو نشره. لاحظ أن التطبيق الناتج غير مناسب لنشر الإنتاج. لا تتردد في نشرها ، بالطبع ، ولكن تعرضها للإنترنت العام فقط على مثيل خادم مريح.
قم بتشغيل الاختبارات بهذه الطريقة ، من جذر المشروع.
clojure -T:build test
يستخدم هذا :build alias لتحميل ملف build.clj ، استنادًا إلى tools.build ، وقم بتشغيل مهمة test .
نأمل أن تمر الاختبارات! يجب أن ترى شيئًا كهذا:
Running tests in #{"test"}
[ Many lines of test runner log messages. ]
Ran 11 tests containing 37 assertions.
0 failures, 0 errors.
ملاحظة حول رسائل السجل:
يمكنك تشغيل التطبيق في أي وقت من تاريخ الالتزام بهذا المشروع. ومع ذلك ، فإن الوظيفة المتاحة ستطابق فقط مع ما يتم بناؤه مع هذا الالتزام.
ابدأ التطبيق وأوجه متصفحك إلى http: // localhost: 3000.
clojure -M -m usermanager.main
إذا كان هذا المنفذ قيد الاستخدام ، فابدأ في منفذ مختلف. على سبيل المثال ، المنفذ 3100:
clojure -M -m usermanager.main 3100
ابدأ الاستراحة
clj -M:dev:test
بمجرد بدء التشغيل ، ابدأ الخادم على المنفذ الافتراضي (المنفذ 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)أشر متصفحك إلى عنوان URL المناسب http: // localhost: portnumber.
استخدم ملفات تعريف dev test عند تشغيل REPL ، سواء كانت قائمة بذاتها ، أو عبر المحرر المفضل لديك.
ثم ، تقييم/تطبيق بعيدا!
لنشر الخادم ، عادةً ما تريد إنشاء "uberjar" -ملف .jar الذي يحتوي على clojure نفسه وجميع التعليمات البرمجية من تطبيقك وتبعياته ، بحيث يمكنك تشغيله باستخدام أمر java -jar . (ولكن كما ذكرت سابقًا ، فإن هذا المشروع ليس برامج إنتاج. لذا نشره فقط على بيئات الخادم.)
يحتوي ملف build.clj - المذكور أعلاه - على مهمة ci :
target.jar مستقل clojure -T:build ci
يجب أن ينتج عنه نفس الناتج مثل test أعلاه ، يليه شيء مثل:
Copying source...
Compiling usermanager.main...
Building JAR...
سيتم إنشاء المجلد target إذا لم يكن موجودًا وسيتضمن مجلد classes يحتوي على جميع رمز مصدر Clojure المترجم من تطبيق usermanager وجميع تبعياته بما في ذلك clojure نفسها:
ls target/classes/
hiccup hiccup2 public ring usermanager
وسيشمل أيضًا ملف .jar المستقل والذي يمكنك تشغيله مثل هذا:
java -jar target/usermanager/example-standalone.jar
هذا يجب أن يتصرف مثل تشغيل مثال التطبيق أعلاه.
يمكن نشر ملف JAR هذا على أي خادم تم تثبيته Java وتشغيله مع عدم وجود تبعيات أو ملفات خارجية أخرى.
قد أقوم بتجربة كيفية استبدال كل قطعة مدفوعة باليد باستخدام مكتبات الإنتاج Clojure.
ولكن ربما يمكنك القيام بذلك بكلماتك الخاصة ، كواجب منزلي محكم الذاتي! سائدا
قارن وتناقض مع تلك المشاريع الأخرى Usermanager-Example ، للحصول على أدلة.
قد يكون المصدر معك!
حقوق الطبع والنشر (C) 2015-2024 شون كورفيلد. حقوق الطبع والنشر (C) 2024 Aditya Athalye.
موزعة تحت رخصة مصدر Apache 2.0.