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

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

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

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

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

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

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

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

4 ответов


чтобы получить хорошее начало, вы можете использовать и 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
  • shell-скрипты и исполняемые файлы входят 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.РБ для обеспечения ваши зависимости gem загружаются при запуске спецификаций.
  3. добавить require "rspec/core/rake_task" и task :default => :spec к вашему Rakefile, так что работает rake будет работать ваши спецификации.

пока вы работаете над своим новым творением, охрана-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 беги!--19-->, который проведет вас через шаги.

~/code/my_lib $ rake release

Дополнительная Литература


здесь некоторые хорошие гиды в 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 ваш код, не делая его драгоценный камень.

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

я создал драгоценный камень который вы можете найти полезным. Учитывая 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!

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

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

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

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

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

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

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

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

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

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

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

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