Ideale Ruby-Projektstruktur

125

Ich bin nach einer Übersicht / Klärung der idealen Projektstruktur für ein Ruby-Projekt (Non-Rails / Merb / etc). Ich vermute, es folgt

app/
  bin/                  #Files for command-line execution
  lib/
    appname.rb
    appname/            #Classes and so on
  Rakefile              #Running tests
  README
  test,spec,features/   #Whichever means of testing you go for
  appname.gemspec       #If it's a gem

Habe ich etwas falsch gemacht Welche Teile habe ich verpasst?

Dylanfm
quelle
1
Ich würde vorschlagen, Yeoman Generator
Nishutosh Sharma

Antworten:

88

Ich denke, das ist ziemlich genau richtig. Standardmäßig fügt Rubygems das lib-Verzeichnis dem Ladepfad hinzu, aber Sie können jedes gewünschte Verzeichnis mit der Variablen $: in dieses Verzeichnis verschieben. dh

$:.push File.expand_path(File.dirname(__FILE__) + '/../surfcompstuff')

Das heißt, wenn Sie surfer.rbin diesem Verzeichnis gesagt haben , können Sie require "surfer"überall und die Datei wird gefunden.

Außerdem erhalten Klassen und Singletons als Konvention eine Datei und Module ein Verzeichnis. Wenn Sie zum Beispiel das LolCatzModul und die LolCatz::MoarKlasse hätten, würde das so aussehen:

lib/
  appname.rb
  lolcatz/
    moar.rb

Aus diesem Grund gibt es einen Ordner lib / appname, da sich die meisten Bibliotheken im appnameNamespace befinden.

Wenn Sie versuchen, den Befehl newgem --simple [projectname]auszuführen, der schnell ein Gerüst für Sie generiert, das nur das Nötigste für ein Ruby-Projekt enthält (und im weiteren Sinne ein Ruby Gem). Es gibt andere Tools, die dies tun, ich weiß, aber Newgem ist ziemlich verbreitet. Normalerweise werde ich die TODO-Datei und all das Skript-Zeug los.

Chris Lloyd
quelle
1
Süss. Ich wusste nichts über Newgem. Meine Nicht-Rails-Projekte haben oft die Rails-Struktur gespiegelt, weil ich sie als vertraut empfunden habe. Vielen Dank für diesen Best-Practice-Tipp.
berlin.ab
Eine andere wichtige Datei könnte "LIZENZ" sein
Bluehavana
2
Ich verstehe das von Ihnen beschriebene Verhalten nicht, wenn libes automatisch zum Ladepfad hinzugefügt wird. Ist es eine 1.9 Sache? Ist eine spezielle Konfiguration erforderlich, um dies zu erreichen?
Emily
5
Sie können auch ein Bundle verwenden, um eine Edelsteinvorlage zu generieren. newgem hat sich zum Zeitpunkt dieses Kommentars seit 9 Monaten nicht mehr verpflichtet. Der Befehl istbundle gem gem_name
Ninjaxor
10

Siehe das folgende Beispiel von http://guides.rubygems.org/what-is-a-gem/

 % tree freewill
    freewill/
    ├── bin/
       └── freewill
    ├── lib/
       └── freewill.rb
    ├── test/
       └── test_freewill.rb
    ├── README
    ├── Rakefile
    └── freewill.gemspec
Sam Shiles
quelle
6

Ich versuche, die Rails-Projektstruktur nachzuahmen, da mein Team, das sich normalerweise mit Rails befasst, die Struktur besser versteht als eine andere Konfiguration. Konvention über Konfiguration - Überbluten von Schienen.

berlin.ab
quelle
6
Wenn sich ein externer Entwickler Ihren Code ansieht, wird er nur Ihre persönliche Konvention sehen. Ich denke, dass bei einem mittleren / großen Projekt die Verwendung einer Reihe von Konventionen, die für eine völlig andere Art von Projekt gedacht sind, noch mehr Verwirrung stiften könnte. Ist es eine Rails App, eine Ruby App? Warum ist es wie eine Rails-App gestaltet? "Ich sollte mich besser mit dem Entwickler in Verbindung setzen, bevor ich etwas kaputt mache ...?" Das wird von Anfang an ein bisschen Overhead
bedeuten
Ich stimme @jj_ zu. Ich weiß, dass dies ein bisschen alt ist, aber ich denke, es ist wichtig, dass die Leute verstehen, warum es Gemeinschaftskonventionen gibt. Es ist so, dass Sie jemanden von der Straße ziehen können, er könnte Ihr Projekt sehen und loslegen. So können Sie etwas nachschlagen und verstehen. Ich halte es für wichtig, die Konventionen der Domain zu verwenden. Domänenkonvention über Projektkonfiguration.
WattsInABox
2

Wenn Sie Bundler verwenden, erhalten Sie durch Ausführen dieses Befehls bundle gem app_namedieselbe Verzeichnisstruktur.

Wenn Sie rspec anstelle von Komponententests verwenden möchten, können Sie diesen Befehl ausführen rspec --init (stellen Sie einfach sicher, dass Sie cd app_namezuerst)

8bithero
quelle