2012-03-03 51 views
83

Tôi muốn tạo một dự án ruby ​​nhỏ với 10-20 lớp/tệp. Tôi cần một số đá quý và tôi muốn sử dụng rspec như khung kiểm tra.Làm thế nào để thiết lập một dự án ruby ​​cơ bản?

Tôi có thể muốn xây dựng một đá quý sau này, nhưng điều đó không chắc chắn.

Có một số Hướng dẫn hoặc Hướng dẫn chỉ cho tôi cách thiết lập cấu trúc cơ bản của dự án của tôi không?

câu hỏi mà tôi có là:

  • nào để tôi đặt tất cả của tôi lỗi tùy chỉnh/Exceptions
  • đâu Có một số công ước trên mạng để đặt tên thư mục như lib, bin, src vv?
  • Tôi nên đặt dữ liệu hoặc tài liệu thử nghiệm ở đâu.
  • Tôi yêu cầu tất cả các tệp của mình ở đâu để tôi có quyền truy cập vào chúng trong dự án của mình.

Tôi biết tôi có thể làm mọi thứ từ đầu, nhưng tôi muốn một số hướng dẫn. Có một số đá quý tốt ở đó mà tôi có thể sao chép, nhưng tôi không chắc chắn những gì tôi thực sự cần và những gì tôi có thể xóa.

Tôi đã xem http://gembundler.com/ nhưng nó dừng sau khi thiết lập trình bao.

+2

Câu hỏi liên quan: http://stackoverflow.com/questions/614309/ideal-ruby-project-structure –

Trả lời

129

Để bắt đầu tốt, bạn có thể sử dụng lệnh bundle gemrspec --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 
  • mã đi trong lib
  • thông số kỹ thuật đi trong spec
  • dữ liệu thử nghiệm hoặc tài liệu đi trong spec/fixtures/
  • Yêu cầu tất cả các file của bạn trong ruby ​​lib/my_lib.rb. Bạn cũng có thể xác định các ngoại lệ của bạn mà tệp hoặc trong các tệp của riêng chúng - theo tùy chọn của riêng bạn.
  • file nguồn C đi trong ext/my_lib
  • kịch bản shell và thực thi đi vào bin

Khi nghi ngờ, chỉ cần nhìn vào viên ngọc như thế nào khác được đặt ra.


Thông tin thêm:

Bạn nên thêm rspec như một sự phụ thuộc phát triển trong gemspec của bạn để làm cho mọi việc dễ dàng hơn cho các nhà phát triển khác

  1. Sửa my_lib.gemspec, thêm gem.add_development_dependency 'rspec'gem.add_development_dependency 'rake' gần đáy.
  2. Thêm Bundler.setuprequire 'my_lib' lên đầu spec/spec_helper.rb để đảm bảo phụ thuộc đá quý của bạn được tải khi bạn chạy thông số kỹ thuật của mình.
  3. Thêm require "rspec/core/rake_task"task :default => :spec vào Rakefile của bạn để chạy rake sẽ chạy thông số kỹ thuật của bạn.

Trong khi bạn đang làm việc trên sáng tạo mới nhất của mình, guard-rspec có thể giúp bạn tiết kiệm thời gian và rắc rối bởi tự động chạy thông số kỹ thuật của bạn như file thay đổi, cảnh báo cho bạn để spec thất bại.

~/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" 

Sau khi bạn hài lòng với sự sáng tạo của bạn, đẩy nó lên đến 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 [email protected]:myusername/my_lib.git 
~/code/my_lib $ git push 

Sau đó, khi bạn đã sẵn sàng để phát hành đá quý của bạn trên Rubygems.org, chạy rake release, mà sẽ đi bộ bạn qua các bước.

~/code/my_lib $ rake release 

Tham khảo thêm

+1

bạn có thể sử dụng '-b, [--bin = Tạo nhị phân cho thư viện của bạn.]' Với 'gói gem'. –

+0

Bạn cũng có thể sử dụng 'bundle gem -t' để thực hiện tương đương với' rspec --init' cùng một lúc. – pioto

+1

Cách thực thi dự án ruby. Tôi đã xây dựng một bàn điều khiển dựa trên dự án ruby ​​cho thời khóa biểu giáo viên của học sinh. Bạn không chắc chắn làm thế nào để thực hiện nó ?? – rAzOr

6

Dưới đây là những quy ước tôi đã thường được thấy (giả sử tên của dự án của bạn là "foo"):

  • /lib/foo.rb - Xác định namespace cấp cao nhất của dự án và phiên bản của nó; yêu cầu các tệp cần thiết.
  • /lib/foo/- Chứa tất cả các lớp cho dự án của bạn, kể cả các lớp liên quan đến lỗi.
  • /test/- Chứa các thử nghiệm cho dự án của bạn.
  • /spec/- Chứa thông số kỹ thuật cho dự án của bạn.
  • /bin/- Nếu dự án của bạn phụ thuộc vào tệp nhị phân (tệp JAR, v.v.), chúng thường đi vào đó.

Bên trong lib /, quy ước thường là tạo thư mục cho từng không gian tên phụ bên trong không gian tên cấp cao nhất của bạn. Ví dụ, lớp Foo :: Bar :: Baz thường được tìm thấy trong /lib/foo/bar/baz.rb.

Một số người muốn tạo tệp /lib/foo/version.rb chỉ để đặt hằng số Foo :: VERSION, nhưng rất thường tôi thấy điều này được xác định trong tệp /lib/foo.rb.

Ngoài ra, nếu bạn đang tạo một viên ngọc, bạn sẽ cần những file sau:

  • /Rakefile - Định nghĩa nhiệm vụ cào (ví dụ như nhiệm vụ để thử nghiệm, xây dựng và đẩy đá quý).
  • /Gemfile - Xác định nguồn gốc của đá quý (trong số những thứ có thể khác).
  • /foo.gemspec - Mô tả đá quý của bạn và cung cấp danh sách phụ thuộc.
10

some nice guides at rubygems.org rằng sẽ giới thiệu bạn đến các công ước và lý luận đằng sau một số người trong số họ. Nói chung, hầu hết các nhà phát triển Ruby đều theo dõi Rubygems naming and directory conventions.

Tôi sẽ chỉ tạo các lớp ngoại lệ tùy chỉnh nếu tôi không thể tìm thấy bất kỳ lớp nào trong thư viện chuẩn phù hợp với mô tả lỗi. Nest lớp lỗi của bạn dưới lớp hoặc mô-đun đó tăng nó:

class Parser::Error < RuntimeError; end 

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

Unit tests đi một trong hai thành /test, nếu bạn đang sử dụng Test::Unit, hoặc vào /spec nếu bạn đang sử dụng RSpec. Tôi khuyên bạn nên sau này.

Bundler là cách tuyệt vời để quản lý đường dẫn tải của bạn. Nó sẽ tự động thiết lập môi trường của bạn chỉ với các phụ thuộc được chỉ định trên Gemfile và tùy chọn gemspec. Nó cũng cho phép bạn dễ dàng require mã của bạn mà không làm cho nó trở thành một viên ngọc.

Tuy nhiên, vì bạn có thể gói mã của mình bằng đá quý trong tương lai, tôi khuyên bạn nên điều tra how to create gem specifications. Bạn nên viết thông số của bạn theo cách thủ công. Không sử dụng một số công cụ để tự động tạo ra nó - theo ý kiến ​​của tôi, các phương pháp tiếp cận vũ phu không cần sao chép thông tin và tàn phá khi được sử dụng với kiểm soát nguồn.

I created a gem mà bạn có thể thấy hữu ích. Với một tệp gemspec, nó xác định nhiều tác vụ hữu ích Rake để làm việc với đá quý của bạn, bao gồm các nhiệm vụ để xây dựng, cài đặt và giải phóng đá quý của bạn tới kho lưu trữ rubygemsgit với gắn thẻ phiên bản tự động. Nó cũng cung cấp một cách dễ dàng để tải mã của bạn trong phiên irb hoặc pry.

# Rakefile 
require 'rookie' 

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

Có một số hướng dẫn trên internet về cách cấu trúc dự án Ruby. Bên cạnh đó, tôi nghĩ cách tốt nhất để giải quyết vấn đề này là hướng tới github và tìm kiếm một số dự án Ruby nổi tiếng, và kiểm tra cấu trúc "của họ".

Bên cạnh yêu cầu đá quý ruby ​​Nói chung, tôi khuyên các công cụ sau cho công việc tốt hơn:

  • editorconfig, giúp nhà phát triển xác định và duy trì phong cách mã hóa phù hợp giữa biên tập viên và IDE khác nhau.
  • rubocop, trình phân tích mã tĩnh cho ruby, defac để linter trong cộng đồng ruby.
  • guard, cùng với một loạt các plugin, bạn có thể chạy bất kỳ lệnh nào tùy thích khi mã thay đổi, tự động.
  • rake, người lái xe phổ quát cho nhiệm vụ dự án khác nhau, chẳng hạn như:
    • package: xây dựng gói đá quý
    • clean: sạch sẽ tạo ra file
    • test: chạy thử
  • yard, phổ biến công cụ tài liệu ruby.

Và bên cạnh đó tất cả các công cụ trên, their're một số dịch vụ trực tuyến cho dự án ruby:

Và bạn thậm chí có thể phù hiệu genearate qua http://shields.io/ cho dự án mã nguồn mở của bạn.

Đó là kinh nghiệm của tôi, hy vọng nó sẽ giúp ích cho một số người.