Як створити базовий проект Ruby?


103

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

Я, можливо, згодом захочу будувати дорогоцінний камінь, але це не точно.

Чи є якісь інструкції чи інструкції, які показують мені, як створити основну структуру мого проекту?

У мене є такі питання:

  • Де я можу розмістити всі власні помилки / винятки?
  • Чи існують якісь умовні умови для іменування каталогів, таких як lib, bin, src тощо?
  • Де я можу поставити дані тесту чи документи?
  • Де мені потрібні всі мої файли, щоб я мав доступ до них у своєму проекті?

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

Я подивився на http://gembundler.com/ , але він зупиняється після налаштування Bundler.


2
Питання, пов’язані з цим: stackoverflow.com/questions/614309/ideal-ruby-project-structure
Andrew Grimm

Відповіді:


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. Ви також можете визначити свої винятки і в цьому файлі або у власних файлах - відповідно до власних уподобань.
  • З вихідними файлами заходять 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_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.
Сельман Улуг

Ви також можете використовувати bundle gem <gem-name> -tеквівалент rspec --initвсіх одночасно.
піото

1
Як виконати проект рубіну. Я побудував проект рубіну на основі консолі для розкладу викладачів студентів. Не знаєте, як це виконати ??
rAzOr

11

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

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

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 - описує ваш дорогоцінний камінь та надає список залежностей.

5

В Інтернеті є кілька посібників про те, як структурувати проект Ruby. Крім того, я вважаю, що найкращим способом вирішити це є перехід над Github і пошук якогось відомого проекту Ruby, і перевірка "їх" структур.

Окрім загальних вимог до дорогоцінних каменів, я рекомендую такі інструменти для кращого робочого процесу:

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

І крім усіх перерахованих вище інструментів, вони є деякими онлайн-сервісами для рубінового проекту:

І ви навіть можете генерувати значки за допомогою http://shields.io/ для вашого проекту з відкритим кодом.

Це мій досвід, сподіваюся, що це допоможе комусь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.