Wie richte ich ein einfaches Ruby-Projekt ein?

103

Ich möchte ein kleines Ruby-Projekt mit 10 ~ 20 Klassen / Dateien erstellen. Ich brauche einige Edelsteine ​​und möchte RSpec als Testframework verwenden.

Ich möchte vielleicht später einen Edelstein bauen, aber das ist nicht sicher.

Gibt es eine Anleitung oder Anleitung, die mir zeigt, wie ich die Grundstruktur meines Projekts einrichte?

Fragen, die ich habe, sind:

  • Wo lege ich alle meine benutzerdefinierten Fehler / Ausnahmen ab?
  • Gibt es einige Konventionen zum Benennen von Verzeichnissen wie lib, bin, src usw.?
  • Wo lege ich Testdaten oder Dokumente ab?
  • Wo benötige ich alle meine Dateien, damit ich in meinem Projekt darauf zugreifen kann?

Ich weiß, dass ich alles von Grund auf neu machen kann, aber ich hätte gerne eine Anleitung. Es gibt einige gute Juwelen, die ich kopieren könnte, aber ich bin nicht sicher, was ich wirklich brauche und was ich löschen kann.

Ich habe mir http://gembundler.com/ angesehen , aber es hört nach dem Einrichten von Bundler auf.

Ayckoster
quelle

Antworten:

156

Um einen guten Start zu erhalten, können Sie den bundle gemBefehl und verwenden 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
  • Code geht rein lib
  • Spezifikationen gehen in spec
  • Testdaten oder Dokumente gehen ein spec/fixtures/
  • Benötigen Sie alle Ihre Ruby-Dateien in lib/my_lib.rb . Sie können Ihre Ausnahmen auch in dieser Datei oder in ihren eigenen Dateien definieren - ganz nach Ihren Wünschen.
  • C-Quelldateien gehen ein ext/my_lib
  • Shell-Skripte und ausführbare Dateien gehen ein bin

Wenn Sie Zweifel haben, schauen Sie sich einfach an, wie andere Edelsteine ​​angeordnet sind.


Weitere Informationen:

Sie sollten rspec als Entwicklungsabhängigkeit in Ihre gemspec einfügen, um anderen Entwicklern die Arbeit zu erleichtern

  1. Bearbeiten Sie my_lib.gemspec, fügen Sie es hinzu gem.add_development_dependency 'rspec'und nähern Sie sich gem.add_development_dependency 'rake'dem unteren Rand.
  2. Fügen Sie Bundler.setupund require 'my_lib'oben in spec / spec_helper.rb hinzu, um sicherzustellen, dass Ihre Gem-Abhängigkeiten geladen werden, wenn Sie Ihre Spezifikationen ausführen.
  3. Fügen Sie require "rspec/core/rake_task"und task :default => :speczu Ihrem Rakefile hinzu, damit rakebeim Ausführen Ihre Spezifikationen ausgeführt werden.

Während Sie an Ihrer neuesten Kreation arbeiten, können Sie mit guard-rspec Zeit und Ärger sparen , indem Sie Ihre Spezifikationen automatisch ausführen, wenn sich Dateien ändern, und Sie auf Spezifikationsfehler aufmerksam machen.

~/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"

Wenn Sie mit Ihrer Kreation zufrieden sind, schieben Sie sie auf 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

Wenn Sie dann bereit sind, Ihren Edelstein auf Rubygems.org freizugeben, führen Sie ihn aus rake release, der Sie durch die einzelnen Schritte führt.

~/code/my_lib $ rake release

Weitere Referenzen

John Douthat
quelle
1
Sie können -b, [--bin=Generate a binary for your library.]mit verwenden bundle gem.
Selman Ulug
Sie können auch bundle gem <gem-name> -tdas Äquivalent von rspec --initallen gleichzeitig ausführen.
Pioto
1
So führen Sie das Ruby-Projekt aus. Ich habe ein konsolenbasiertes Ruby-Projekt für den Stundenplan der Schüler und Lehrer erstellt. Nicht sicher, wie man es ausführt?
rAzOr
11

Auf rubygems.org gibt es einige nette Anleitungen , die Ihnen die Konventionen und die Gründe für einige von ihnen vorstellen. Im Allgemeinen werden die meisten Ruby-Entwickler den Rubygems-Namens- und Verzeichniskonventionen folgen.

Ich würde nur benutzerdefinierte Ausnahmeklassen erstellen, wenn ich keine Klasse in der Standardbibliothek finden könnte, die der Fehlerbeschreibung entspricht. Verschachteln Sie Ihre Fehlerklasse unter der Klasse oder dem Modul, die bzw. das sie auslöst:

class Parser::Error < RuntimeError; end

begin
  Parser.new(:invalid).parse!
rescue Parser::Error => e
  puts e.message
end

Unit-Tests gehen entweder in /test, wenn Sie verwenden Test::Unit, oder in, /specwenn Sie verwenden RSpec. Ich empfehle letzteres.

Bundlerist eine großartige Möglichkeit, Ihren Ladepfad zu verwalten. Es wird Ihre Umgebung automatisch nur mit den Abhängigkeiten einrichten, die auf Gemfileund optional angegeben sind gemspec. Außerdem können Sie requireIhren Code ganz einfach erstellen, ohne ihn zu einem Juwel zu machen.

Da Sie Ihren Code jedoch möglicherweise in Zukunft in einem Edelstein bündeln, empfehle ich, zu untersuchen, wie Edelsteinspezifikationen erstellt werden . Sie sollten Ihre Spezifikation manuell schreiben. Verwenden Sie kein Tool, um es automatisch zu generieren - meiner Meinung nach handelt es sich um Brute-Force-Ansätze, die Informationen unnötig duplizieren und bei Verwendung mit der Quellcodeverwaltung Chaos anrichten.

Ich habe ein Juwel geschaffen, das Sie vielleicht nützlich finden. Bei einer gemspecDatei definiert es viele nützlichen RakeAufgaben für die Zusammenarbeit mit Edelsteine arbeiten, die Aufgaben für den Aufbau umfasst, die Installation und Juwel Freigabe rubygemsund gitRepository mit automatischer Version Tagging. Es bietet auch eine einfache Möglichkeit, Ihren Code in eine irboder eine prySitzung zu laden .

# Rakefile
require 'rookie'

# Run `rake -T` for the complete task list
Rookie::Tasks.new('your_gem.gemspec').define_tasks!
Matheus Moreira
quelle
6

Hier sind die Konventionen, die ich am häufigsten gesehen habe (vorausgesetzt, Ihr Projekt heißt "foo"):

  • /lib/foo.rb - Definiert den Namespace der obersten Ebene des Projekts und seiner Version. benötigt benötigte Dateien.
  • / lib / foo / - Enthält alle Klassen für Ihr Projekt, einschließlich fehlerbezogener Klassen.
  • / test / - Enthält Tests für Ihr Projekt.
  • / spec / - Enthält die Spezifikationen für Ihr Projekt.
  • / bin / - Wenn Ihr Projekt von Binärdateien (JAR-Dateien usw.) abhängt, werden diese normalerweise dort gespeichert.

In lib / besteht die Konvention normalerweise darin, einen Ordner für jeden Sub-Namespace in Ihrem Namespace der obersten Ebene zu erstellen. Beispielsweise befindet sich die Klasse Foo :: Bar :: Baz normalerweise unter /lib/foo/bar/baz.rb.

Einige Leute möchten eine /lib/foo/version.rb-Datei erstellen, um die Foo :: VERSION-Konstante festzulegen, aber sehr oft habe ich dies in der /lib/foo.rb-Datei definiert gesehen.

Wenn Sie einen Edelstein erstellen, benötigen Sie außerdem die folgenden Dateien:

  • / Rakefile - Definiert Rake-Aufgaben (z. B. Aufgaben zum Testen, Erstellen und Schieben des Edelsteins).
  • / Gemfile - Definiert die Quelle des Edelsteins (unter anderem).
  • /foo.gemspec - Beschreibt Ihren Edelstein und bietet eine Liste der Abhängigkeiten.
user2398029
quelle
5

Im Internet gibt es einige Anleitungen zum Strukturieren eines Ruby-Projekts. Außerdem denke ich, dass der beste Weg, dies zu lösen, darin besteht, über Github zu gehen und nach einem berühmten Ruby-Projekt zu suchen und "ihre" Strukturen zu überprüfen.

Neben den allgemeinen Anforderungen an Rubinsteine ​​empfehle ich die folgenden Tools für einen besseren Workflow:

  • Mit editorconfig können Entwickler konsistente Codierungsstile zwischen verschiedenen Editoren und IDEs definieren und beibehalten.
  • rubocop , statischer Code-Analysator für Ruby, der Defac zum Linter in der Ruby-Community.
  • Mit guard können Sie zusammen mit einer Reihe von Plugins beliebige Befehle automatisch ausführen, wenn sich der Code ändert.
  • Rake , der universelle Treiber für verschiedene Projektaufgaben, wie zum Beispiel:
    • package: Edelsteinpaket bauen
    • clean: Generierte Dateien bereinigen
    • test: Lauftest
  • Hof , beliebtes Rubin-Dokumentationswerkzeug.

Und neben all den oben genannten Tools gibt es einen Onlinedienst für Ruby-Projekte:

Und Sie können sogar Abzeichen über http://shields.io/ für Ihr Open Source-Projekt erstellen .

Das ist meine Erfahrung, hoffe es hilft jemandem.

Xiao Hanyu
quelle