โครงสร้างโครงการ Ruby ในอุดมคติ


125

ฉันตามภาพรวม / ชี้แจงโครงสร้างโครงการที่เหมาะสำหรับโครงการทับทิม (ไม่ใช่ราง / merb / etc) ฉันคาดเดาตามนี้

app/
  bin/                  #Files for command-line execution
  lib/
    appname.rb
    appname/            #Classes and so on
  Rakefile              #Running tests
  README
  test,spec,features/   #Whichever means of testing you go for
  appname.gemspec       #If it's a gem

ฉันมีอะไรผิดปกติหรือเปล่า? ฉันพลาดส่วนใดไปบ้าง


1
ฉันขอแนะนำให้ใช้เครื่องกำเนิดไฟฟ้า Yeoman
Nishutosh Sharma

คำตอบ:


88

ฉันคิดว่านั่นเป็นจุดที่น่าสนใจมาก ตามค่าเริ่มต้น Rubygems จะเพิ่มไดเร็กทอรี lib ไปยัง loadpath แต่คุณสามารถพุชไดเร็กทอรีใด ๆ ที่คุณต้องการไปยังไดเร็กทอรีนั้นโดยใช้ตัวแปร $: กล่าวคือ

$:.push File.expand_path(File.dirname(__FILE__) + '/../surfcompstuff')

นั่นหมายความว่าเมื่อคุณพูดsurfer.rbใน dir นั้นคุณสามารถทำได้require "surfer"ทุกที่และไฟล์จะพบ

นอกจากนี้ตามแบบแผนคลาสและซิงเกิลได้รับไฟล์และโมดูลจะได้รับไดเร็กทอรี ตัวอย่างเช่นหากคุณมีLolCatzโมดูลและLolCatz::Moarคลาสที่จะมีลักษณะดังนี้:

lib/
  appname.rb
  lolcatz/
    moar.rb

นั่นคือเหตุผลที่มีโฟลเดอร์ lib / appname เนื่องจากไลบรารีส่วนใหญ่อยู่ในappnameเนมสเปซ

นอกจากนี้หากคุณลองเรียกใช้คำสั่งnewgem --simple [projectname]ที่จะสร้างโครงสำหรับคุณอย่างรวดเร็วโดยมีเพียงสิ่งจำเป็นสำหรับโปรเจ็กต์ Ruby (และโดยการขยาย Ruby Gem) มีเครื่องมืออื่น ๆ ที่ทำสิ่งนี้ได้ แต่ newgem นั้นค่อนข้างธรรมดา ฉันมักจะกำจัดไฟล์ TODO และสิ่งที่เป็นสคริปต์ทั้งหมด


1
หวาน. ฉันไม่รู้เกี่ยวกับ newgem โครงการที่ไม่ใช่รางของฉันมักจะสะท้อนโครงสร้างทางรถไฟเพราะฉันพบว่ามันคุ้นเคย ขอขอบคุณสำหรับเคล็ดลับแนวทางปฏิบัติที่ดีที่สุดนี้
berlin.ab

ไฟล์สำคัญอีกไฟล์อาจเป็น "LICENSE"
bluehavana

2
ฉันไม่เข้าใจพฤติกรรมที่คุณอธิบายเมื่อlibถูกเพิ่มลงใน loadpath โดยอัตโนมัติ มันเป็น 1.9 หรือไม่? การกำหนดค่าพิเศษใด ๆ ที่จำเป็นเพื่อให้มันเกิดขึ้น?
Emily

5
คุณยังสามารถใช้บันเดิลเพื่อสร้างเทมเพลตอัญมณี newgem ไม่ได้ให้คำมั่นเป็นเวลา 9 เดือนในขณะที่แสดงความคิดเห็นนี้ คำสั่งคือbundle gem gem_name
Ninjaxor


6

ฉันพยายามเลียนแบบโครงสร้างโครงการ Rails เนื่องจากทีมของฉันซึ่งมักจะเกี่ยวข้องกับ Rails จะเข้าใจโครงสร้างได้ดีกว่าการกำหนดค่าอื่น Convention over Configuration - เลือดออกจาก Rails


6
หากนักพัฒนาภายนอกบางคนดูโค้ดของคุณสิ่งที่เขา / เขาจะเห็นเป็นเพียงการประชุมส่วนตัวของคุณ ฉันคิดว่าสำหรับโครงการขนาดกลาง / ใหญ่การใช้ชุดการประชุมที่มีไว้สำหรับโครงการประเภทต่างๆโดยสิ้นเชิงอาจทำให้เกิดความสับสนมากขึ้น มันคือแอพรางแอพทับทิม? ทำไมถึงออกแบบมาเหมือนแอพราง "ฉันควรติดต่อกับนักพัฒนาซอฟต์แวร์ก่อนที่ฉันจะทำอะไรผิดพลาด ... ?" นั่นจะเพิ่มค่าใช้จ่ายเล็กน้อยตั้งแต่เริ่มต้น ..
jj_

ฉันเห็นด้วยกับ @jj_ ฉันรู้ว่ามันเก่าไปแล้ว แต่ฉันคิดว่ามันสำคัญที่คนจะเข้าใจว่าทำไมต้องมีการประชุมของชุมชน เพื่อให้คุณสามารถดึงใครบางคนออกจากถนนพวกเขาสามารถเห็นโครงการของคุณและแตกได้ เพื่อให้คุณสามารถค้นหาบางสิ่งและทำความเข้าใจได้ ฉันรู้สึกว่าการใช้รูปแบบของโดเมนเป็นเรื่องสำคัญ การประชุมโดเมนมากกว่าการกำหนดค่าโครงการ
WattsInABox

2

หากคุณใช้บันเดิลเลอร์การรันคำสั่งนี้bundle gem app_nameจะทำให้คุณมีโครงสร้างไดเร็กทอรีเดียวกัน

หากคุณต้องการใช้ rspec แทนการทดสอบหน่วยคุณสามารถรันคำสั่งนี้ได้rspec --init (ตรวจสอบให้แน่ใจcd app_nameก่อน)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.