Ідеальна структура проекту Ruby


125

Я після огляду / уточнення ідеальної структури проекту для рубінового проекту (без рейки / merb / тощо). Я здогадуюсь, що це випливає

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
Нішутош Шарма

Відповіді:


88

Я думаю, що це дуже багато місця. За замовчуванням Rubygems додасть каталог lib до завантажувального шляху, але ви можете натиснути на нього будь-який каталог, використовуючи змінну $:. тобто

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

Це означає, що коли ви скажете, surfer.rbу цьому режимі ви можете require "surfer"куди завгодно, і файл знайдеться.

Також, за умовою, класи та сингли отримують файл, а модулі отримують каталог. Наприклад, якби у вас був LolCatzмодуль і LolCatz::Moarклас, який би виглядав так:

lib/
  appname.rb
  lolcatz/
    moar.rb

Ось чому існує папка lib / appname, оскільки більшість бібліотек знаходяться в appnameпросторі імен.

Крім того, якщо ви спробуєте запустити команду, newgem --simple [projectname]яка швидко генерує ешафот для вас за допомогою просто голої необхідності для проекту Ruby (і розширення Ruby Gem). Є й інші інструменти, які роблять це, я знаю, але ньюджем досить поширений. Зазвичай я позбуваюсь файлу TODO та всіх сценаріїв.


1
солодкий. Я не знав про Newgem. Мої проекти без рейок часто відображають структуру Rails, тому що я знайшов її знайомою. Дякуємо за цю пораду з найкращих практик.
berlin.ab

Ще одним важливим файлом може бути "ЛІЦЕНЗІЯ"
bluehavana

2
Я не розумію поведінку, яку ви описуєте lib, автоматично додаючи її на навантажувальний шлях. Це 1,9 річ? Будь-яка спеціальна конфігурація, необхідна для того, щоб це сталося?
Емілі

5
Ви також можете використовувати пакет для генерування шаблону дорогоцінних каменів. на момент коментаря до newgem не було прийнято жодних 9 місяців. Командаbundle gem gem_name
Ninjaxor


6

Я намагаюся імітувати структуру проекту Rails, тому що моя команда, яка зазвичай має справу з Rails, зрозуміє структуру краще, ніж інша конфігурація. Конвенція про конфігурацію - кровотеча з Рейки.


6
Якщо якийсь зовнішній розробник дивиться на ваш код, то те, що він / він побачить, - це лише ваша особиста умова. Я думаю, що для середнього / великого проекту використання набору конвенцій, призначених для абсолютно іншого виду проектів, може навіть викликати більше плутанини. Це програма для рейок, додаток для рубіну? Чому він створений як додаток для рейок? "Я краще зв’яжусь із розробником, перш ніж щось зламати ..." Це буде додати трохи накладних з самого початку ..
jj_

Я згоден з @jj_. Я знаю, що це щось старе, але я думаю, що важливо, щоб люди розуміли, чому існують конвенції громади. Це так, що ви можете витягнути когось із вулиці, він міг побачити ваш проект і зламатись. Це так, що ви можете щось подивитися і зрозуміти. Я вважаю, що важливо використовувати конвенції домену. Конвенція домену щодо конфігурації проекту.
WattsInABox

2

Якщо ви використовуєте bundler, виконання цієї команди bundle gem app_nameнадасть вам таку саму структуру каталогу.

Якщо ви хочете використовувати rspec замість одиничних тестів, тоді можна запустити цю команду rspec --init (просто переконайтеся, що cd app_nameспочатку)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.