Как мне настроить базовый проект Ruby? - PullRequest
96 голосов
/ 04 марта 2012

Я хочу создать небольшой проект Ruby с 10 ~ 20 классами / файлами. Мне нужны драгоценные камни, и я хочу использовать RSpec в качестве тестовой среды.

Возможно, я захочу построить камень позже, но это не точно.

Есть ли какое-нибудь практическое руководство или руководство, которое показывает мне, как настроить базовую структуру моего проекта?

Вопросы, которые у меня есть:

  • Куда я могу поместить все мои собственные ошибки / исключения?
  • Существуют ли какие-либо соглашения для именования каталогов, таких как lib, bin, src и т. Д.?
  • Где я могу поместить данные испытаний или документы?
  • Где мне нужны все мои файлы, чтобы у меня был доступ к ним в моем проекте?

Я знаю, что могу сделать все с нуля, но мне хотелось бы получить руководство. Есть несколько хороших жемчужин, которые я мог бы скопировать, но я не уверен, что мне действительно нужно и что я могу удалить.

Я посмотрел на http://gembundler.com/,, но он останавливается после настройки Bundler.

Ответы [ 4 ]

150 голосов
/ 04 марта 2012

Чтобы получить хорошее начало, вы можете использовать команду bundle gem и 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
  • код входит в lib
  • спецификации идут в spec
  • данные испытаний или документы входят в spec/fixtures/
  • Требуются все ваши файлы ruby ​​в lib/my_lib.rb.Вы также можете определить свои исключения в этом файле или в их собственных файлах - в соответствии со своими предпочтениями. Исходные файлы
  • C входят в ext/my_lib
  • сценарии оболочки и исполняемые файлы входят вbin

Если вы сомневаетесь, просто посмотрите, как раскладываются другие драгоценные камни.


Дополнительная информация:

Вы должны добавить rspec в качестве зависимости разработки в ваш gemspec, чтобы упростить задачу другим разработчикам

  1. Редактировать my_lib.gemspec, добавив gem.add_development_dependency 'rspec' и gem.add_development_dependency 'rake' в нижней части.
  2. Добавьте Bundler.setup и require 'my_lib' в начало spec / spec_helper.rb, чтобы гарантировать, что ваши gem-зависимости загружаются при запуске ваших спецификаций.
  3. Добавьте require "rspec/core/rake_task" и task :default => :spec в ваш Rakefile, чтобызапуск rake запустит ваши спецификации.

Пока вы работаете над своим новейшим творением, guard-rspec может сэкономить ваше время и хлопоты благодаря автоматически запуск ваших спецификаций при изменении файлов, оповещение о сбоях спецификаций.

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

Aесли вы довольны своим созданием, отправьте его на 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

Затем, когда вы будете готовы выпустить свой драгоценный камень на Rubygems.org, запустите rake release, который проведет вас черезшаги.

~/code/my_lib $ rake release

Дополнительные ссылки

11 голосов
/ 04 марта 2012

На rubygems.org есть несколько хороших руководств, которые познакомят вас с конвенциями и обоснованием некоторых из них. В целом, соглашения об именах и каталогах Rubygems соблюдаются большинством разработчиков Ruby.

Я бы создал пользовательские классы исключений, только если бы я не смог найти ни одного класса в стандартной библиотеке, соответствующей описанию ошибки. Вложите свой класс ошибок в класс или модуль, который его вызывает:

class Parser::Error < RuntimeError; end

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

Модульные тесты входят либо в /test, если вы используете Test::Unit, либо в /spec, если вы используете RSpec. Я рекомендую последнее.

Bundler - это отличный способ управления траекторией загрузки. Он автоматически настроит вашу среду, используя только зависимости, указанные в Gemfile и, необязательно, gemspec. Это также позволяет вам легко require ваш код, не делая его драгоценным камнем.

Однако, поскольку в будущем вы можете связать свой код с гемом, я рекомендую изучить , как создать спецификации гема . Вы должны написать свою спецификацию вручную. Не используйте какой-либо инструмент для его автоматической генерации - это, на мой взгляд, подходы грубой силы, которые бесполезно дублируют информацию и наносят ущерб при использовании с контролем версий.

Я создал камень , который может оказаться полезным. Имея файл gemspec, он определяет множество полезных задач Rake для работы с вашим гемом, в том числе задачи по сборке, установке и выпуску вашего гема в репозиторий rubygems и git с автоматическим тегированием версий. Он также предоставляет простой способ загрузки кода в сеансе irb или pry.

# Rakefile
require 'rookie'

# Run `rake -T` for the complete task list
Rookie::Tasks.new('your_gem.gemspec').define_tasks!
6 голосов
/ 04 марта 2012

Вот соглашения, которые я чаще всего видел (при условии, что ваш проект называется «foo»):

  • / lib / foo.rb - Определяет пространство имен верхнего уровня проекта и еговерсия;требуются необходимые файлы.
  • / lib / foo / - содержит все классы для вашего проекта, включая классы, связанные с ошибками.
  • / test / - содержит тесты для вашего проекта.
  • / spec / - содержит спецификации для вашего проекта.
  • / bin / - Если ваш проект зависит от двоичных файлов (JAR-файлов и т. д.), они обычно идут туда.

Внутри lib / обычно принято создавать папку для каждого подпространства имен внутри пространства имен верхнего уровня.Например, класс Foo :: Bar :: Baz обычно находится в /lib/foo/bar/baz.rb.

Некоторым людям нравится создавать файл /lib/foo/version.rb просто дляустановите константу Foo :: VERSION, но очень часто я видел это в файле /lib/foo.rb.

Кроме того, если вы создаете гем, вам понадобятся следующие файлы:

  • / Rakefile - Определяет грабли (например, задачи по тестированию, сборке и сборке драгоценного камня).
  • / Gemfile - Определяет источник драгоценного камня (среди прочих возможных вещей).
  • / foo.gemspec - описывает ваш гем и предоставляет список зависимостей.
4 голосов
/ 05 января 2016

В Интернете есть несколько руководств о том, как структурировать проект Ruby. Кроме того, я думаю, что лучший способ решить эту проблему - это перейти на github и поискать какой-нибудь известный проект Ruby и проверить «их» структуры.

Помимо общих требований к ruby ​​gem, я рекомендую следующие инструменты для улучшения рабочего процесса:

  • editorconfig , помогает разработчикам определять и поддерживать согласованные стили кодирования между различными редакторами и IDE.
  • rubocop , статический анализатор кода для ruby, дефиниция для линтера в сообществе ruby.
  • guard , вместе с кучей плагинов, вы можете автоматически запускать любые команды, какие захотите, когда код изменяется.
  • rake , универсальный драйвер для различных задач проекта, таких как:
    • package: сборка пакета гемов
    • clean: очистить сгенерированные файлы
    • test: запустить тест
  • ярд , популярный инструмент документации ruby.

И, кроме всех вышеперечисленных инструментов, есть онлайн-сервис для проекта ruby:

И вы даже можете создавать значки с помощью http://shields.io/ для вашего проекта с открытым исходным кодом.

Это мой опыт, надеюсь, кому-то это поможет.

...