Как мне настроить базовый проект 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, чтобы облегчить работу другим разработчикам
- Отредактируйте my_lib.gemspec, добавив
gem.add_development_dependency 'rspec'
и gem.add_development_dependency 'rake'
в нижней части. - Добавьте
Bundler.setup
и require 'my_lib'
в верхней части spec/spec_helper.rb, чтобы гарантировать, что ваши гемные зависимости загружаются при запуске ваших спецификаций. - Добавьте в ваш 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, популярный инструмент для рубиновой документации.
И помимо всех вышеперечисленных инструментов их онлайн-сервис для рубинового проекта:
- CI (непрерывная интеграция)
- Обзор кодов
И вы можете даже генерировать значки через http://shields.io/ для своего проекта с открытым исходным кодом.
Это мой опыт, надеюсь, что это поможет кому-то.