Aplikasi ini adalah varian stripped-down dari proyek UserManager-Example dari Sean Corfield (disinkronkan sebagai Commit SHA 2A9CF63).
Proyek contoh "manajer pengguna" Sean yang asli dan variannya (termasuk yang ini), bertujuan untuk mendemistifikasi "Cara Membangun Aplikasi Web Clojure Menggunakan Hanya Perpustakaan?" .
"Komposisi atas warisan", "perpustakaan atas kerangka kerja", dan "orientasi data" menonjol di model mental kanonik dunia Clojure, termasuk pemrograman web. Tidak ada beberapa intuisi utama ini, bahkan pengembang berpengalaman yang baru mengenal Clojure cenderung berjuang untuk membangun aplikasi menggunakan perpustakaan. Kumpulan "manajer pengguna" dari demo bertujuan untuk mengatasi tantangan khusus ini. Mereka tidak bercita -cita untuk mengajarkan praktik terbaik pengembangan web. Untuk itu, semua contoh "manajer pengguna" adalah aplikasi gaya kecil, disederhanakan, "Web 1.0".
Proyek ini memperluas primer "dari prinsip pertama" yang saya tulis di " Clojuring the Web Application Stack: Meditation One ". Saya memilih untuk menggunakan aplikasi demo asli Sean sebagai spesifikasi karena:
Jika tidak ada yang lain, itu ada untuk menggaruk gatalnya sendiri ... Saya suka penjelasan barebones dan suka turun "tunggu, tapi mengapa?" lubang dan garis singgung kelinci.
Anda lihat, semua demo "manajer pengguna" lainnya, meskipun sederhana, dibangun dengan perpustakaan yang digunakan oleh para profesional Clojure di aplikasi web produksi dunia nyata. Jadi, jika perpustakaan adalah pendahulu dari tumpukan web (kustom) seseorang (atau kerangka kerja) ... apa yang akan menjadi pendahulu perpustakaan? Tidak ada perpustakaan :)
Tetap handy The Original User Manager ", dan posting blog saya, untuk referensi berdampingan saat Anda mengerjakan basis kode ini.
Jika ada yang tidak jelas, atau salah, jangan ragu untuk membuka masalah (tapi tolong jangan mengubah struktur kode).
Saya telah membuatnya untuk membantu pembaca mengamati bagian demi sepotong "pembuatan" aplikasi. Konsultasikan dengan ReadME sebagai komitmen yang dipertanyakan untuk instruksi penggunaan yang relevan dengan titik pengembangan.
Saya pikir kita belajar lebih baik dengan secara progresif beralih dari perkiraan model mental berbutir kasar ke yang memiliki kesetiaan tinggi. Dengan demikian, beberapa penyederhanaan yang disengaja dapat mengganggu para profesional web (seperti menggunakan Get to Delete). Seseorang mempercayai peserta didik untuk mengambil cara "benar" untuk melakukan sesuatu dari jumlah total studi, eksperimen, kolega, dan mentor mereka.
Saat belajar, terkadang baik untuk gelisah;)
Apa yang diharapkan, jika Anda bekerja maju dari komit pertama:
curl ke aplikasi. curl localhost:3000
curl -XPOST localhost:3000/some/path?q=somethingsomething
curl -XDELETE localhost:3000/foo/bar/baz
usermanager.main namespace harus selalu memiliki beberapa cara saat ini-sebagai-komit untuk memulai/menghentikan proses server (dan/atau keadaan aplikasi saat ini).usermanager.* Namespace, itu petunjuk.usermanager.main harus memudahkan memulihkan server Anda, setelah memulai kembali repl.dev/ direktori proyek (Anda mungkin harus membuatnya secara manual).department dan addressbook ).dev ...Seperti yang saya sebutkan, saya telah mengurangi sebanyak mungkin perpustakaan, tanpa mengorbankan kesetiaan pada desain proyek asli. Pengecualiannya adalah, segala bentuk host interop antara aplikasi web kami dan dunia luar. Saya mengasumsikan solusi yang sudah ada sebelumnya (perpustakaan) untuk kebutuhan itu (saya harus menggambar batas di suatu tempat!). Juga beberapa utilitas kenyamanan makhluk yang bukan pusat tema penjelasan prinsip pertama ini.
Hark kembali ke posting blog untuk mendapatkan gambaran yang lebih baik tentang di mana dan mengapa saya menggambar batas ini.
Secara khusus, saya sudah menggunakan:
Agar tetap setia pada spesifikasi Sean untuk API UserManager, model domain, dan "logika bisnis" inti, saya memiliki bagian lurus dari sumber pengguna-contohnya:
Untuk memperkuat gagasan menyusun bagian yang bergerak menggunakan data clojure biasa, saya telah membuat kode saya untuk menggunakan pilihan desain yang dibuat oleh Sean (misalnya menyuntikkan nama tampilan dalam konteks permintaan, untuk digunakan nanti oleh logika rendering HTML). Demikian juga, untuk tetap setia pada spesifikasi cincin, semua utilitas cincin dan middleware yang ditulis sendiri mengikuti spesifikasi ring. Mengganti mereka dengan aslinya yang disediakan cincin harus langsung.
Jika Anda memilih untuk menulis varian Anda sendiri, saya sarankan mengikuti.
Itu harus jelas sekarang, tetapi saya akan menyatakannya tetap saja ... aplikasi yang dilucuti sama sekali tidak kuat untuk tuntutan dunia nyata karena itu menghilangkan hampir semua perpustakaan yang digunakan oleh contoh "manajer pengguna" lainnya, yang melakukan semua "nilai produksi" yang berat bagi kami. Bahkan aplikasi tersebut akan membutuhkan beberapa pekerjaan yang dilakukan pada mereka (ulasan desain, pengujian integrasi, pemeriksaan keamanan dll.), Jika mereka memenuhi syarat untuk penyebaran dunia nyata.
Sama seperti proyek UserManager-Resample Sean.
deps.edn .tools.build untuk menggunakan perintah dari file build.clj . Ini disertakan melalui :build alias file deps.edn . Proyek Clojure-Cli-Using menggunakan file build.clj seperti itu berdasarkan konvensi, untuk memberikan fungsionalitas pembangunan proyek standar dan kustom. Project Skeleton Setup Tools biasanya menghasilkan secara otomatis file ini. Saya sudah menyalinnya dari proyek Sean. Kloning repo, cd ke dalamnya, kemudian ikuti salah satu metode di bawah ini untuk mencoba aplikasi dan/atau menggunakannya. Perhatikan bahwa aplikasi yang dihasilkan tidak cocok untuk penyebaran produksi. Jangan ragu untuk menggunakannya, tentu saja, tetapi mengeksposnya ke internet publik hanya pada instance server yang dibuang.
Jalankan tes dengan cara ini, dari akar proyek.
clojure -T:build test
Ini menggunakan :build alias untuk memuat file build.clj , berdasarkan tools.build , dan jalankan tugas test .
Semoga tes lulus! Anda harus melihat sesuatu seperti ini:
Running tests in #{"test"}
[ Many lines of test runner log messages. ]
Ran 11 tests containing 37 assertions.
0 failures, 0 errors.
Catatan tentang pesan log:
Anda dapat menjalankan aplikasi pada titik mana pun dalam sejarah komit proyek ini. Namun , fungsionalitas yang tersedia hanya akan cocok dengan apa pun yang dibangun dengan komit itu.
Mulai aplikasi dan arahkan browser Anda ke http: // localhost: 3000.
clojure -M -m usermanager.main
Jika port itu digunakan, mulai di port yang berbeda. Misalnya, Port 3100:
clojure -M -m usermanager.main 3100
Mulai repl
clj -M:dev:test
Setelah rept dimulai, mulailah server di port default (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)Arahkan browser Anda ke url http: // localhost: portnumber.
Gunakan profil dev dan test saat Anda menjalankan repl, apakah mandiri, atau melalui editor favorit Anda.
Lalu, evaluasi/terapkan!
Untuk penyebaran server, Anda biasanya ingin membangun "uberjar" -file .jar yang berisi clojure itu sendiri dan semua kode dari aplikasi Anda dan ketergantungannya, sehingga Anda dapat menjalankannya dengan perintah java -jar . (Tapi seperti yang saya nyatakan sebelumnya, proyek ini bukan perangkat lunak produksi. Jadi sebutkan hanya untuk membuang lingkungan server.)
File build.clj - yang disebutkan di atas - berisi tugas ci yang:
target.jar mandiri clojure -T:build ci
Itu seharusnya menghasilkan output yang sama seperti test di atas, diikuti oleh sesuatu seperti:
Copying source...
Compiling usermanager.main...
Building JAR...
Folder target akan dibuat jika tidak ada dan akan menyertakan folder classes yang berisi semua kode sumber Clojure yang dikompilasi dari aplikasi usermanager dan semua dependensinya termasuk Clojure itu sendiri:
ls target/classes/
hiccup hiccup2 public ring usermanager
Ini juga akan mencakup file .jar mandiri yang dapat Anda jalankan seperti ini:
java -jar target/usermanager/example-standalone.jar
Ini harus berperilaku sama dengan menjalankan contoh aplikasi di atas.
File JAR ini dapat digunakan ke server mana pun yang telah diinstal dan dijalankan Java tanpa dependensi atau file eksternal lainnya.
Saya mungkin demo cara mengganti setiap bagian dengan tangan menggunakan perpustakaan produksi clojure.
Tapi mungkin Anda bisa melakukannya dengan kata-kata Anda sendiri, sebagai pekerjaan rumah yang ditugaskan sendiri! :)
Bandingkan dan kontras dengan proyek UserManager-Resample lainnya, untuk petunjuk.
Semoga sumbernya bersamamu!
Hak Cipta (C) 2015-2024 Sean Corfield. Hak Cipta (C) 2024 Aditya Athalye.
Didistribusikan di bawah Lisensi Sumber Apache 2.0.