แอพนี้เป็นตัวแปรที่ลดลงของโครงการตัวอย่าง UserManager- ตัวอย่างของ Sean Corfield (ซิงค์ตาม Commit SHA 2A9CF63)
ตัวอย่างโครงการ "ตัวจัดการผู้ใช้" ดั้งเดิมของฌอนและตัวแปร (รวมถึงโครงการนี้) ตั้งเป้าหมายที่จะ demystify "วิธีการสร้างเว็บแอปพลิเคชัน Clojure โดยใช้ไลบรารีเท่านั้น?" -
"องค์ประกอบเหนือมรดก", "ห้องสมุดเหนือเฟรมเวิร์ก" และ "การวางแนวข้อมูล" มีคุณสมบัติเด่นชัดในรูปแบบการเขียนโปรแกรมทางจิตของ Clojure World รวมถึงการเขียนโปรแกรมเว็บ ขาดสัญชาตญาณที่สำคัญเหล่านี้แม้กระทั่งนักพัฒนาที่มีประสบการณ์ซึ่งยังใหม่ต่อ Clojure มักจะดิ้นรนเพื่อสร้างแอพโดยใช้ห้องสมุด กลุ่ม "ผู้จัดการผู้ใช้" ของการสาธิตมีจุดมุ่งหมายเพื่อจัดการกับความท้าทายเฉพาะนี้ พวกเขา ไม่ ปรารถนาที่จะสอนแนวทางปฏิบัติที่ดีที่สุดในการพัฒนาเว็บ ด้วยเหตุนี้ตัวอย่าง "ตัวจัดการผู้ใช้" ทั้งหมดจึงมีขนาดเล็กง่ายขึ้น "แอพสไตล์ Web 1.0"
โครงการนี้ขยายออกจากไพรเมอร์ "จากหลักการแรก" ที่ฉันเขียนลงใน " Clojuring The Web Application Stack: Meditation One " ฉันเลือกที่จะใช้แอพสาธิตดั้งเดิมของฌอนเป็นข้อกำหนดเพราะ:
ถ้าไม่มีอะไรอื่นมันจะมีรอยขีดข่วนคันของตัวเอง ... ฉันชอบคำอธิบายเปลือยเปล่าและรักที่จะลงไป "รอ แต่ทำไม?" รูกระต่ายและแทนเจนต์
คุณจะเห็นการสาธิต "ตัวจัดการผู้ใช้" อื่น ๆ ทั้งหมดแม้ว่าจะง่าย แต่ก็ถูกสร้างขึ้นด้วยห้องสมุดที่ใช้โดยผู้เชี่ยวชาญด้าน Clojure ในเว็บแอปพลิเคชันการผลิตในโลกแห่งความเป็นจริง ดังนั้นหากห้องสมุดเป็นสารตั้งต้นของเว็บสแต็ก (หรือกรอบ) (หรือกรอบ) ... อะไรคือสารตั้งต้นของห้องสมุด? ไม่มีห้องสมุด :)
ให้ความสะดวกแก่ผู้จัดการผู้ใช้เดิม "และโพสต์บล็อกของฉันสำหรับการอ้างอิงแบบเคียงข้างกันในขณะที่คุณทำงานผ่าน codebase นี้
หากมีสิ่งใดที่ไม่ชัดเจนหรือผิดพลาดโปรดเปิดปัญหา (แต่โปรดอย่าเปลี่ยนโครงสร้างของรหัส)
ฉันได้สร้างมันขึ้นมาเพื่อช่วยให้ผู้อ่านสังเกต "การทำ" ของแอพทีละชิ้น ปรึกษา 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 ควรง่ายขึ้นในการกู้คืนเซิร์ฟเวอร์ของคุณหลังจากรีสตาร์ท Repldev/ ไดเรกทอรีของโครงการ (คุณอาจต้องสร้างด้วยตนเอง)department และ addressbook )dev ...อย่างที่ฉันพูดถึงฉันได้ลบล้างห้องสมุดให้มากที่สุดเท่าที่จะทำได้โดยไม่ลดทอนความซื่อสัตย์ต่อการออกแบบของโครงการดั้งเดิม ข้อยกเว้นคือรูปแบบใด ๆ ของโฮสต์ระหว่างแอปพลิเคชันของเราและโลกภายนอก ฉันคิดว่าโซลูชั่นที่มีอยู่แล้ว (ห้องสมุด) สำหรับความต้องการเหล่านั้น (ฉันต้องวาดขอบเขตที่ไหนสักแห่ง!) นอกจากนี้ยังมียูทิลิตี้ความสะดวกสบายของสิ่งมีชีวิตที่ไม่ได้เป็นศูนย์กลางของธีมของคำอธิบายหลักการแรกนี้
Hark กลับไปที่บล็อกโพสต์เพื่อให้ได้ภาพที่ดีขึ้นเกี่ยวกับสถานที่และทำไมฉันถึงวาดขอบเขตนี้
โดยเฉพาะฉันใช้:
เพื่อให้ได้ความเป็นจริงตามข้อกำหนดของฌอนสำหรับ API ของ UserManager โมเดลโดเมนและ "หลักการทางธุรกิจ" หลักฉันมีส่วนที่คัดลอกมาจากแหล่งที่มาของ userManager-Example ของเขา:
เพื่อเสริมความคิดในการเขียนชิ้นส่วนที่เคลื่อนไหวโดยใช้ข้อมูล clojure ธรรมดาฉันได้สร้างรหัสของฉันเพื่อใช้ตัวเลือกการออกแบบที่ทำโดยฌอน (เช่นการฉีดชื่อของมุมมองในบริบทคำขอสำหรับการใช้งานในภายหลังโดยตรรกะการเรนเดอร์ HTML) ในทำนองเดียวกันเพื่อให้เป็นจริงกับข้อกำหนดของแหวนยูทิลิตี้แหวนที่เขียนด้วยตนเองทั้งหมดและมิดเดิลแวร์ตามข้อมูลจำเพาะวงแหวน การแทนที่พวกเขาด้วยต้นฉบับที่ให้แหวนควรตรงไปตรงมา
หากคุณเลือกที่จะเขียนตัวแปรของคุณเองฉันขอแนะนำให้ติดตามชุดต่อไปนี้
ตอนนี้มันควรจะชัดเจน แต่ฉันจะระบุมันต่อไป ... แอพพลิเคชั่นที่ถูกถอดออกไม่ได้มีความต้องการในความต้องการในโลกแห่งความเป็นจริงเพราะมันละเว้นห้องสมุดเกือบทั้งหมดที่ใช้โดยตัวอย่าง "ผู้จัดการผู้ใช้" อื่น ๆ แม้แต่แอพเหล่านั้นจะต้องทำงานให้เสร็จ (บทวิจารณ์การออกแบบการทดสอบการรวมการตรวจสอบความปลอดภัย ฯลฯ ) หากพวกเขามีคุณสมบัติในการปรับใช้ในโลกแห่งความเป็นจริง
เช่นเดียวกับโครงการ userManager- ตัวอย่างของฌอน
deps.edntools.build Library เพื่อใช้คำสั่งจากไฟล์ build.clj มันรวมผ่าน :build นามแฝงของไฟล์ deps.edn โครงการการใช้งานของ Clojure-cli-cli-cli ใช้ไฟล์ build.clj ตามการประชุมเพื่อจัดทำฟังก์ชั่นการสร้างโครงการมาตรฐานและกำหนดเอง เครื่องมือการตั้งค่าโครงกระดูกโครงการมักจะสร้างไฟล์นี้โดยอัตโนมัติ ฉันคัดลอกมาจากโครงการของฌอน โคลน repo, cd ลงไปแล้วทำตามวิธีการใด ๆ ด้านล่างเพื่อลองใช้แอพและ/หรือปรับใช้ โปรดทราบว่า แอพที่ได้นั้นไม่เหมาะสำหรับการปรับใช้การผลิต อย่าลังเลที่จะปรับใช้แน่นอน แต่เปิดเผยไปยังอินเทอร์เน็ตสาธารณะเฉพาะในอินสแตนซ์เซิร์ฟเวอร์ที่ทิ้ง
เรียกใช้การทดสอบด้วยวิธีนี้จากรากของโครงการ
clojure -T:build test
สิ่งนี้ใช้ :build นามแฝงเพื่อโหลดไฟล์ 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
เริ่ม REPL
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 และเรียกใช้โดยไม่มีการอ้างอิงภายนอกหรือไฟล์อื่น ๆ
ฉันอาจสาธิตวิธีการแทนที่ชิ้นส่วนที่รีดด้วยมือแต่ละชิ้นโดยใช้ไลบรารีการผลิต
แต่บางทีคุณสามารถทำได้ด้วยคำพูดของคุณเองเช่นเดียวกับการบ้านที่ออกแบบมาเอง! -
เปรียบเทียบและเปรียบเทียบกับโครงการ userManager- ตัวอย่างอื่น ๆ สำหรับเบาะแส
ขอให้แหล่งข่าวอยู่กับคุณ!
ลิขสิทธิ์ (c) 2015-2024 ฌอนคอร์ฟิลด์ ลิขสิทธิ์ (c) 2024 Aditya Athalye
แจกจ่ายภายใต้ใบอนุญาต Apache Source 2.0