ฉันจะตั้งค่าโปรเจ็กต์ Ruby พื้นฐานได้อย่างไร?


103

ฉันต้องการสร้างโปรเจ็กต์ Ruby ขนาดเล็กที่มี 10 ~ 20 คลาส / ไฟล์ ฉันต้องการอัญมณีและต้องการใช้ RSpec เป็นกรอบการทดสอบ

ฉันอาจต้องการสร้างอัญมณีในภายหลัง แต่ก็ไม่แน่ใจ

มีวิธีการหรือคำแนะนำที่แสดงวิธีการตั้งค่าโครงสร้างพื้นฐานของโครงการของฉันหรือไม่?

คำถามที่ฉันมีคือ:

  • ฉันจะใส่ข้อผิดพลาด / ข้อยกเว้นที่กำหนดเองทั้งหมดไว้ที่ไหน
  • มีข้อกำหนดบางประการสำหรับการตั้งชื่อไดเร็กทอรีเช่น lib, bin, src เป็นต้นหรือไม่?
  • ฉันจะใส่ข้อมูลหรือเอกสารการทดสอบได้ที่ไหน?
  • ฉันต้องการไฟล์ทั้งหมดของฉันที่ไหนเพื่อให้ฉันสามารถเข้าถึงไฟล์เหล่านั้นในโครงการของฉันได้

ฉันรู้ว่าฉันสามารถทำทุกอย่างได้ตั้งแต่เริ่มต้น แต่ฉันต้องการคำแนะนำ มีอัญมณีดีๆมากมายที่ฉันสามารถคัดลอกได้ แต่ฉันไม่แน่ใจว่าต้องการอะไรจริงๆและสิ่งที่ฉันสามารถลบได้

ฉันดูที่http://gembundler.com/แต่มันหยุดหลังจากตั้งค่า Bundler


2
คำถามที่เกี่ยวข้อง: stackoverflow.com/questions/614309/ideal-ruby-project-structure
Andrew Grimm

คำตอบ:


156

ในการเริ่มต้นที่ดีคุณสามารถใช้bundle gemคำสั่งและrspec --init.

~/code $ bundle gem my_lib
      create  my_lib/Gemfile
      create  my_lib/Rakefile
      create  my_lib/LICENSE.txt
      create  my_lib/README.md
      create  my_lib/.gitignore
      create  my_lib/my_lib.gemspec
      create  my_lib/lib/my_lib.rb
      create  my_lib/lib/my_lib/version.rb
Initializating git repo in /Users/john/code/my_lib
~/code $ cd my_lib/
~/code/my_lib $ git commit -m "Empty project"
~/code/my_lib $ rspec --init
The --configure option no longer needs any arguments, so true was ignored.
  create   spec/spec_helper.rb
  create   .rspec
  • รหัสเข้าไป lib
  • สเป็คเข้าไปเลย spec
  • ทดสอบข้อมูลหรือเอกสารเข้าไป spec/fixtures/
  • ต้องการไฟล์ทับทิมทั้งหมดของคุณในรูปแบบlib/my_lib.rb. คุณสามารถกำหนดข้อยกเว้นของคุณในไฟล์นั้นด้วยหรือในไฟล์ของพวกเขาเองก็ได้ - ตามความต้องการของคุณเอง
  • C ซอร์สไฟล์เข้าไป ext/my_lib
  • เชลล์สคริปต์และไฟล์ปฏิบัติการเข้าไป bin

หากมีข้อสงสัยเพียงแค่ดูว่าอัญมณีอื่น ๆ ถูกจัดวางอย่างไร


ข้อมูลเพิ่มเติม:

คุณควรเพิ่ม rspec เป็นการพึ่งพาการพัฒนาใน gemspec ของคุณเพื่อให้ง่ายขึ้นสำหรับนักพัฒนาคนอื่น ๆ

  1. แก้ไข my_lib.gemspec เพิ่มgem.add_development_dependency 'rspec'และgem.add_development_dependency 'rake'ใกล้ด้านล่างสุด
  2. เพิ่มBundler.setupและrequire 'my_lib'ที่ด้านบนของ spec / spec_helper.rb เพื่อให้แน่ใจว่าการอ้างอิงอัญมณีของคุณถูกโหลดเมื่อคุณเรียกใช้ข้อมูลจำเพาะของคุณ
  3. เพิ่มrequire "rspec/core/rake_task"และtask :default => :specลงใน Rakefile ของคุณเพื่อให้การรันrakeรันข้อมูลจำเพาะของคุณ

ในขณะที่คุณกำลังสร้างผลงานใหม่ล่าสุดGuard-rspecสามารถช่วยคุณประหยัดเวลาและความยุ่งยากได้โดยการเรียกใช้ข้อมูลจำเพาะของคุณโดยอัตโนมัติเมื่อไฟล์มีการเปลี่ยนแปลงโดยจะแจ้งเตือนให้คุณทราบถึงความล้มเหลวของข้อมูลจำเพาะ

~/code/my_lib $ git add spec/spec_helper.rb
~/code/my_lib $ git commit -am "Add RSpec"
~/code/my_lib $ vim my_lib.gemspec # add guard development dependency
~/code/my_lib $ bundle
~/code/my_lib $ bundle exec guard init
~/code/my_lib $ vim Guardfile # Remove the sections below the top one
~/code/my_lib $ git add Guardfile
~/code/my_lib $ git commit -am "Add Guard"

หลังจากคุณพอใจกับผลงานของคุณแล้วให้ดันขึ้นไปที่ github

# create a github repository for your gem, then push it up
~/code/my_lib $ curl -u myusername https://api.github.com/user/repos -d '{"name":"my_lib"}' 
~/code/my_lib $ git remote add origin git@github.com:myusername/my_lib.git
~/code/my_lib $ git push

จากนั้นเมื่อคุณพร้อมที่จะปล่อยอัญมณีของคุณบน Rubygems.org ให้เรียกใช้rake releaseซึ่งจะนำคุณไปสู่ขั้นตอนต่างๆ

~/code/my_lib $ rake release

การอ้างอิงเพิ่มเติม


1
คุณสามารถใช้-b, [--bin=Generate a binary for your library.]กับbundle gem.
Selman Ulug

คุณยังสามารถใช้bundle gem <gem-name> -tเพื่อทำสิ่งที่เทียบเท่าrspec --initทั้งหมดในครั้งเดียว
pioto

1
วิธีดำเนินการโครงการทับทิม ฉันได้สร้างโครงการทับทิมที่ใช้คอนโซลสำหรับตารางเรียนครูของนักเรียน ไม่แน่ใจว่าจะดำเนินการอย่างไร ??
rAzOr

11

มีคำแนะนำดีๆที่ rubygems.orgซึ่งจะแนะนำคุณเกี่ยวกับอนุสัญญาและเหตุผลเบื้องหลังบางส่วน โดยทั่วไปแล้วการตั้งชื่อ Rubygems และรูปแบบไดเร็กทอรีจะตามมาด้วยนักพัฒนา Ruby ส่วนใหญ่

ฉันจะสร้างคลาสข้อยกเว้นที่กำหนดเองได้ก็ต่อเมื่อไม่พบคลาสใด ๆ ในไลบรารีมาตรฐานที่ตรงกับคำอธิบายข้อผิดพลาด ซ้อนคลาสข้อผิดพลาดของคุณภายใต้คลาสหรือโมดูลที่เพิ่มขึ้น:

class Parser::Error < RuntimeError; end

begin
  Parser.new(:invalid).parse!
rescue Parser::Error => e
  puts e.message
end

การทดสอบหน่วยไปอย่างใดอย่างหนึ่งลงไป/testถ้าคุณกำลังใช้Test::Unitหรือเข้าไปในถ้าคุณกำลังใช้/spec RSpecขอแนะนำอย่างหลัง

Bundlerเป็นวิธีที่ยอดเยี่ยมในการจัดการเส้นทางการโหลดของคุณ มันจะตั้งค่าสภาพแวดล้อมของคุณโดยอัตโนมัติโดยมีเฉพาะการอ้างอิงที่ระบุไว้ในGemfileไฟล์gemspec. นอกจากนี้ยังช่วยให้คุณสามารถrequireรหัสของคุณได้อย่างง่ายดายโดยไม่ต้องทำให้เป็นอัญมณี

แต่เนื่องจากคุณอาจกำรหัสของคุณในอัญมณีในอนาคตผมขอแนะนำให้ตรวจสอบวิธีการสร้างรายละเอียดอัญมณี คุณควรเขียนข้อกำหนดของคุณด้วยตนเอง อย่าใช้เครื่องมือบางอย่างในการสร้างโดยอัตโนมัติ - ในความคิดของฉันเป็นวิธีการ brute force ที่ทำซ้ำข้อมูลโดยไม่จำเป็นและสร้างความหายนะเมื่อใช้กับการควบคุมแหล่งที่มา

ฉันสร้างอัญมณีที่คุณอาจพบว่ามีประโยชน์ ให้gemspecไฟล์กำหนดRakeงานที่มีประโยชน์มากมายสำหรับการทำงานกับอัญมณีของคุณซึ่งรวมถึงงานสร้างติดตั้งและปล่อยอัญมณีของคุณไปยังrubygemsและgitเก็บด้วยการติดแท็กเวอร์ชันอัตโนมัติ นอกจากนี้ยังมีวิธีง่ายๆในการโหลดโค้ดของคุณในเซสชันirbหรือpry

# Rakefile
require 'rookie'

# Run `rake -T` for the complete task list
Rookie::Tasks.new('your_gem.gemspec').define_tasks!

6

นี่คือการประชุมที่ฉันเห็นบ่อยที่สุด (สมมติว่าชื่อโครงการของคุณคือ "foo"):

  • /lib/foo.rb - กำหนดเนมสเปซระดับบนสุดของโปรเจ็กต์และเวอร์ชัน ต้องการไฟล์ที่จำเป็น
  • / lib / foo / - มีคลาสทั้งหมดสำหรับโปรเจ็กต์ของคุณรวมถึงคลาสที่เกี่ยวข้องกับข้อผิดพลาด
  • / test / - ประกอบด้วยการทดสอบสำหรับโครงการของคุณ
  • / spec / - มีข้อกำหนดสำหรับโครงการของคุณ
  • / bin / - หากโปรเจ็กต์ของคุณขึ้นอยู่กับไบนารี (ไฟล์ JAR ฯลฯ ) พวกเขามักจะเข้าไปที่นั่น

ภายใน lib / การประชุมมักจะสร้างโฟลเดอร์สำหรับแต่ละเนมสเปซย่อยภายในเนมสเปซระดับบนสุดของคุณ ตัวอย่างเช่นคลาส Foo :: Bar :: Baz มักจะอยู่ใต้ /lib/foo/bar/baz.rb

บางคนชอบสร้างไฟล์ /lib/foo/version.rb เพื่อตั้งค่าคงที่ Foo :: VERSION แต่บ่อยครั้งที่ฉันเห็นสิ่งนี้ถูกกำหนดไว้ในไฟล์ /lib/foo.rb

นอกจากนี้หากคุณกำลังสร้างอัญมณีคุณจะต้องมีไฟล์ต่อไปนี้:

  • / Rakefile - กำหนดงานคราด (เช่นงานสำหรับการทดสอบการสร้างและการผลักดันอัญมณี)
  • / Gemfile - กำหนดแหล่งที่มาของอัญมณี (จากสิ่งอื่น ๆ ที่เป็นไปได้)
  • /foo.gemspec - อธิบายอัญมณีของคุณและระบุรายการการอ้างอิง

5

มีคำแนะนำบนอินเทอร์เน็ตเกี่ยวกับวิธีจัดโครงสร้างโครงการ Ruby นอกจากนี้ฉันคิดว่าวิธีที่ดีที่สุดในการแก้ปัญหานี้คือมุ่งหน้าไปที่ github และมองหาโครงการ Ruby ที่มีชื่อเสียงและตรวจสอบโครงสร้าง "ของพวกเขา"

นอกเหนือจากข้อกำหนดอัญมณีทับทิมทั่วไปแล้วฉันขอแนะนำเครื่องมือต่อไปนี้เพื่อให้ขั้นตอนการทำงานดีขึ้น:

  • editorconfigช่วยนักพัฒนาในการกำหนดและรักษารูปแบบการเข้ารหัสที่สอดคล้องกันระหว่างบรรณาธิการและ IDE ที่แตกต่างกัน
  • rubocop , เครื่องวิเคราะห์รหัสคงที่สำหรับทับทิม, defac to linter ในชุมชนทับทิม
  • ยามพร้อมกับปลั๊กอินจำนวนมากคุณสามารถเรียกใช้คำสั่งใดก็ได้ตามที่คุณต้องการเมื่อรหัสเปลี่ยนแปลงโดยอัตโนมัติ
  • คราดไดรเวอร์สากลสำหรับงานโครงการต่างๆเช่น:
    • package: สร้างแพ็คเกจอัญมณี
    • clean: ล้างไฟล์ที่สร้างขึ้น
    • test: เรียกใช้การทดสอบ
  • ลานเครื่องมือจัดทำเอกสารทับทิมยอดนิยม

นอกจากเครื่องมือข้างต้นแล้วยังมีบริการออนไลน์สำหรับโครงการ Ruby:

และคุณยังสามารถสร้างตราผ่านhttp://shields.io/สำหรับโครงการโอเพนซอร์สของคุณ

นั่นเป็นประสบการณ์ของฉันหวังว่ามันจะช่วยได้บ้าง

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