Làm cách nào để thiết lập một dự án Ruby cơ bản?


103

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 làm khung thử nghiệm.

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

Có một số cách thực hiệ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à:

  • Tôi đặt tất cả các Lỗi / Ngoại lệ tùy chỉnh của mình ở đâu?
  • Có một số quy ước đặt tên thư mục như lib, bin, src, v.v.?
  • Tôi đặ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ố viên ngọc tốt ngoài kia mà tôi có thể sao chép, nhưng tôi không chắc mình thực sự cần gì và có thể xóa gì.

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


Câu trả lời:


156

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

Khi nghi ngờ, chỉ cần nhìn vào cách các viên đá quý khác được bố trí.


Thêm thông tin:

Bạn nên thêm rspec làm phụ thuộc phát triển trong gemspec của mình để giúp mọi thứ dễ dàng hơn cho các nhà phát triển khác

  1. Chỉnh sửa my_lib.gemspec, thêm gem.add_development_dependency 'rspec'gem.add_development_dependency 'rake'gần cuối.
  2. Thêm Bundler.setuprequire 'my_lib'vào đầu spec / spec_helper.rb để đảm bảo các 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 => :specvào Rakefile của bạn, để chạy rakesẽ chạy các thông số kỹ thuật của bạn.

Trong khi bạn đang làm việc trên bả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à không gặp rắc rối bằng cách tự động chạy các thông số kỹ thuật của bạn khi các tệp thay đổi, cảnh báo bạn về các lỗi thông số kỹ thuật.

~/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áng tạo của mình, hãy đẩy nó lê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 git@github.com:myusername/my_lib.git
~/code/my_lib $ git push

Sau đó, khi bạn đã sẵn sàng phát hành gem của mình trên Rubygems.org, hãy chạy rake release, phần này sẽ hướng dẫn 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=Generate a binary for your library.]với bundle gem.
Selman Ulug

Bạn cũng có thể sử dụng bundle gem <gem-name> -tđể làm tương đương với rspec --inittất cả cùng một lúc.
pioto

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

11

một số hướng dẫn thú vị tại rubygems.org sẽ giới thiệu cho bạn các quy ước và lý do đằng sau một số quy ước đó. Nói chung, hầu hết các nhà phát triển Ruby đều tuân theo các quy ước đặt tên và thư mục của Rubygems .

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. Lồng lớp lỗi của bạn dưới lớp hoặc mô-đun làm tăng nó:

class Parser::Error < RuntimeError; end

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

Kiểm tra đơn vị đi vào /test, nếu bạn đang sử dụng Test::Unithoặc /specnếu bạn đang sử dụng RSpec. Tôi đề nghị cái sau.

Bundlerlà một 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ần phụ thuộc được chỉ định trên Gemfilevà tùy chọn gemspec. Nó cũng cho phép bạn dễ dàng requiremã hóa mà không cần biến nó thành một viên ngọc.

Tuy nhiên, vì bạn có thể gói mã của mình trong một viên đá quý trong tương lai, tôi khuyên bạn nên tìm hiểu cách tạo thông số kỹ thuật của viên đá quý . Bạn nên viết đặc tả của mình theo cách thủ công. Đừng sử dụng một số công cụ để tự động tạo ra nó - theo quan điểm của tôi, chúng là những cách tiếp cận bạo lực không cần thiết để sao chép thông tin và tàn phá khi được sử dụng với kiểm soát nguồn.

Tôi đã tạo ra một viên đá quý mà bạn có thể thấy hữu ích. Với một gemspectệp, nó xác định nhiều Raketác vụ hữu ích để làm việc với gem của bạn, bao gồm các tác vụ xây dựng, cài đặt và phát hành gem của bạn rubygemsgitkho lưu trữ với tính năng 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 một irbhoặc pryphiên.

# Rakefile
require 'rookie'

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

6

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

  • /lib/foo.rb - Xác định không gian tên 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, bao gồm các lớp liên quan đến lỗi.
  • / test / - Chứa các bài kiểm tra cho dự án của bạn.
  • / spec / - Chứa các 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 các 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 một thư mục cho mỗi vùng tên con bên trong vùng 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 thích tạo tệp /lib/foo/version.rb chỉ để đặt hằng số Foo :: VERSION, nhưng rất thường xuyên tôi thấy điều này được định nghĩa trong tệp /lib/foo.rb.

Ngoài ra, nếu bạn đang tạo đá quý, bạn sẽ cần các tệp sau:

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

5

Có một số hướng dẫn trên internet về cách cấu trúc một 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à truy cập 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 chúng".

Bên cạnh các yêu cầu chung về đá quý ruby, tôi khuyên bạn nên sử dụng các công cụ sau để quy trình làm việc tốt hơn:

  • editorconfig , giúp các nhà phát triển xác định và duy trì các kiểu mã hóa nhất quán giữa các trình soạn thảo và IDE khác nhau.
  • rubocop , trình phân tích mã tĩnh cho ruby, trình phân tích mã định nghĩa trong cộng đồng ruby.
  • bảo vệ , cùng với một loạt các plugins, bạn có thể chạy bất kỳ lệnh như bạn giống như khi thay đổi mã, tự động.
  • rake , trình điều khiển chung cho các nhiệm vụ dự án khác nhau, chẳng hạn như:
    • package: xây dựng gói đá quý
    • clean: các tệp được tạo sạch
    • test: chạy thử nghiệm
  • sân , công cụ tài liệu phổ biến về ruby.

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

Và bạn thậm chí có thể phân biệt các huy hiệu qua http://shields.io/ cho dự án nguồn mở của mình.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.