Как мне настроить базовый проект Ruby?

103

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

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

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

У меня есть следующие вопросы:

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

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

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

Айкостер
источник
2
Связанный вопрос: stackoverflow.com/questions/614309/ideal-ruby-project-structure
Эндрю Гримм

Ответы:

156

Для начала можно использовать 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/
  • Требуйте, чтобы все ваши рубиновые файлы были в формате 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, чтобы обеспечить загрузку зависимостей гемов при запуске спецификаций.
  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"

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

Дальнейшие ссылки

Джон Даутат
источник
1
вы можете использовать -b, [--bin=Generate a binary for your library.]с bundle gem.
Selman Ulug
Вы также можете использовать bundle gem <gem-name> -tдля выполнения эквивалента rspec --initвсего сразу.
pioto
1
Как выполнить рубиновый проект. Я создал проект Ruby на консоли для расписания студентов-учителей. Не знаете, как это сделать?
rAzOr
11

На 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

Вот соглашения, которые я чаще всего видел (при условии, что ваш проект называется «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 - описывает ваш гем и предоставляет список зависимостей.
user2398029
источник
5

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

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

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

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

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

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

Сяо Ханью
источник