Cấu trúc dự án Ruby lý tưởng


125

Tôi đang tìm hiểu tổng quan / làm rõ cấu trúc dự án lý tưởng cho dự án ruby ​​(không phải đường ray / merb / etc). Tôi đoán nó theo sau

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

Tôi đã có một cái gì đó sai? Những phần tôi đã bỏ lỡ?


1
Tôi sẽ đề nghị sử dụng máy phát Yeoman
Nishutosh Sharma

Câu trả lời:


88

Tôi nghĩ rằng đó là khá nhiều điểm trên. Theo mặc định, Rubygems sẽ thêm thư mục lib vào loadpath, nhưng bạn có thể đẩy bất kỳ thư mục nào bạn muốn lên đó bằng biến $ :. I E

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

Điều đó có nghĩa là khi bạn nói, surfer.rbtrong thư mục đó, bạn có thể require "surfer"tìm thấy bất cứ nơi nào và tập tin sẽ được tìm thấy.

Ngoài ra, như một quy ước, các lớp và singletons có được một tệp và các mô-đun có được một thư mục. Chẳng hạn, nếu bạn có LolCatzmô-đun và LolCatz::Moarlớp trông như sau:

lib/
  appname.rb
  lolcatz/
    moar.rb

Đó là lý do tại sao có một thư mục lib / appname vì hầu hết các thư viện đều nằm trong appnamekhông gian tên.

Ngoài ra, nếu bạn thử chạy lệnh newgem --simple [projectname]sẽ nhanh chóng tạo ra một giàn giáo cho bạn chỉ với các yếu tố cần thiết cho dự án Ruby (và bằng cách mở rộng Ruby Gem). Có những công cụ khác làm điều này, tôi biết, nhưng newgem khá phổ biến. Tôi thường loại bỏ tệp TODO và tất cả nội dung tập lệnh.


1
ngọt. Tôi không biết về newgem. Các dự án phi đường ray của tôi thường nhân đôi cấu trúc Rails vì tôi thấy nó quen thuộc. Cảm ơn cho mẹo thực hành tốt nhất này.
berlin.ab

Một tập tin quan trọng khác có thể là "PHÉP"
bluehavana

2
Tôi không nhận được hành vi mà bạn mô tả libkhi được tự động thêm vào đường dẫn. Có phải là một điều 1.9? Bất kỳ cấu hình đặc biệt cần thiết để có được nó xảy ra?
Emily

5
Bạn cũng có thể sử dụng gói để tạo mẫu đá quý. newgem đã không được cam kết trong 9 tháng tại thời điểm nhận xét này. Lệnh làbundle gem gem_name
Ninjaxor

10

Xem ví dụ sau từ http://guides.rubygems.org/what-is-a-gem/

 % tree freewill
    freewill/
    ├── bin/
       └── freewill
    ├── lib/
       └── freewill.rb
    ├── test/
       └── test_freewill.rb
    ├── README
    ├── Rakefile
    └── freewill.gemspec

6

Tôi cố gắng bắt chước cấu trúc dự án Rails vì nhóm của tôi, thường giao dịch với Rails, sẽ hiểu cấu trúc tốt hơn cấu hình khác. Công ước về cấu hình - chảy máu từ Rails.


6
Nếu một số nhà phát triển bên ngoài nhìn vào mã của bạn, những gì họ sẽ thấy chỉ là quy ước cá nhân của bạn . Tôi nghĩ rằng đối với một dự án vừa / lớn, sử dụng một tập hợp các quy ước có nghĩa là cho một loại dự án hoàn toàn khác thậm chí có thể gây ra nhiều nhầm lẫn hơn. Nó có phải là một ứng dụng rails, một ứng dụng ruby? Tại sao nó được thiết kế giống như một ứng dụng đường ray? "Tôi nên liên lạc với nhà phát triển trước khi tôi phá vỡ thứ gì đó ...?" Điều đó sẽ thêm một chút chi phí ngay từ đầu ..
jj_

Tôi đồng ý với @jj_. Tôi biết điều này hơi cũ, nhưng tôi nghĩ điều quan trọng là mọi người hiểu tại sao có các quy ước cộng đồng. Đó là vì vậy bạn có thể kéo ai đó ra đường, họ có thể thấy dự án của bạn và bị bẻ khóa. Đó là vì vậy bạn có thể tìm kiếm một cái gì đó và hiểu nó. Tôi cảm thấy điều quan trọng là sử dụng các quy ước của tên miền. Quy ước tên miền về cấu hình dự án.
WattsInABox

2

Nếu bạn sử dụng bundler, chạy lệnh bundle gem app_namenày sẽ cung cấp cho bạn cấu trúc thư mục tương tự.

Nếu bạn muốn sử dụng rspec thay vì kiểm tra đơn vị, thì bạn có thể chạy lệnh này rspec --init (Chỉ cần đảm bảo bạn cd app_nametrước)

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.