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

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

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

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

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

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

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

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

Ответ 1

Чтобы хорошо начать, вы можете использовать команду 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. Добавьте в ваш Rakefile require "rspec/core/rake_task" и task :default => :spec, чтобы 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 [email protected]:myusername/my_lib.git
~/code/my_lib $ git push

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

~/code/my_lib $ rake release

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

Ответ 2

Есть некоторые интересные руководства на 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!

Ответ 3

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

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

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

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

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

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

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