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

125

Мне нужен обзор / разъяснение идеальной структуры проекта для проекта ruby ​​(non-rails / merb / etc). Я предполагаю, что это следует

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

Я что-то не так понял? Какие части я пропустил?

dylanfm
источник
1
Я бы предложил использовать генератор
Йомена

Ответы:

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). Я знаю, что есть и другие инструменты, которые делают это, но newgem довольно распространен. Обычно я избавляюсь от файла TODO и всего остального скрипта.

Крис Ллойд
источник
1
сладкий. Я не знал о newgem. Мои не-рельсовые проекты часто отражали структуру Rails, потому что я находил ее знакомой. Спасибо за этот совет.
berlin.ab 06
Еще одним важным файлом может быть «ЛИЦЕНЗИЯ»
bluehavana
2
Я не получаю описанного вами поведения при libавтоматическом добавлении в путь загрузки. Это вещь 1.9? Для этого требуется какая-то особая конфигурация?
Эмили,
5
Вы также можете использовать пакет для создания шаблона драгоценного камня. На момент написания этого комментария newgem не выполнял никаких обязательств в течение 9 месяцев. Командаbundle gem gem_name
Ninjaxor
10

См. Следующий пример с 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

Я пытаюсь имитировать структуру проекта Rails, потому что моя команда, которая обычно имеет дело с Rails, будет понимать структуру лучше, чем другая конфигурация. Соглашение о конфигурации - утечка из Rails.

berlin.ab
источник
6
Если какой-то внешний разработчик посмотрит на ваш код, то, что он увидит, будет лишь вашим личным соглашением. Я думаю, что для среднего / большого проекта использование набора соглашений, предназначенных для совершенно другого типа проекта, может даже вызвать большую путаницу. Это приложение rails или ruby? Почему он разработан как приложение для рельсов? «Мне лучше связаться с разработчиком, прежде чем я что-нибудь сломаю ...?» Это добавит немного накладных расходов с самого начала ..
jj_
Я согласен с @jj_. Я знаю, что это старовато, но я думаю, что важно, чтобы люди понимали, почему существуют общественные собрания. Это для того, чтобы вы могли вытащить кого-нибудь с улицы, чтобы он увидел ваш проект и взломал. Это для того, чтобы вы могли что-то найти и понять. Я считаю важным использовать условные обозначения предметной области. Соглашение о домене важнее конфигурации проекта.
WattsInABox
2

Если вы используете сборщик, запуск этой команды bundle gem app_nameдаст вам ту же структуру каталогов.

Если вы хотите использовать rspec вместо модульных тестов, вы можете запустить эту команду rspec --init (просто убедитесь, что вы cd app_nameсначала)

8bithero
источник