Struttura ideale del progetto Ruby


125

Sto cercando una panoramica / chiarimento della struttura ideale del progetto per un progetto ruby ​​(non-rails / merb / etc). Immagino che segue

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

Ho sbagliato qualcosa? Quali parti mi sono perso?


1
Suggerirei di usare il generatore Yeoman
Nishutosh Sharma,

Risposte:


88

Penso che sia praticamente perfetto. Per impostazione predefinita, Rubygems aggiungerà la directory lib al percorso di caricamento, ma è possibile spingere qualsiasi directory desiderata su quella usando la variabile $ :. vale a dire

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

Ciò significa che quando hai detto, surfer.rbin quella require "surfer"directory , puoi ovunque e il file verrà trovato.

Inoltre, come convenzione, classi e singoli ottengono un file e i moduli ottengono una directory. Ad esempio, se avessi il LolCatzmodulo e la LolCatz::Moarclasse che assomiglierebbero a:

lib/
  appname.rb
  lolcatz/
    moar.rb

Ecco perché esiste una cartella lib / appname perché la maggior parte delle librerie si trova nello appnamespazio dei nomi.

Inoltre, se provi a eseguire il comando newgem --simple [projectname]che genererà rapidamente uno scaffold per te con solo gli elementi essenziali nudi per un progetto Ruby (e per estensione una gemma Ruby). Ci sono altri strumenti che lo fanno, lo so, ma newgem è piuttosto comune. Di solito mi sbarazzo del file TODO e di tutto il materiale dello script.


1
dolce. Non sapevo di Newgem. I miei progetti non-rails hanno spesso rispecchiato la struttura di Rails perché l'ho trovata familiare. Grazie per questo suggerimento sulle migliori pratiche.
berlin.ab,

Un altro file importante potrebbe essere "LICENZA"
bluehavana,

2
Non capisco il comportamento che descrivi con libl'aggiunta automatica al percorso di carico. È una cosa 1.9? Qualche configurazione speciale richiesta per farlo accadere?
Emily,

5
Puoi anche usare il bundle per generare un modello gem. newgem non si è impegnato per 9 mesi al momento di questo commento. Il comando èbundle gem gem_name
Ninjaxor,

10

Vedi il seguente esempio da http://guides.rubygems.org/what-is-a-gem/

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

6

Cerco di imitare la struttura del progetto Rails perché il mio team, che di solito si occupa di Rails, capirà la struttura meglio di un'altra configurazione. Convenzione sulla configurazione - bleeding da Rails.


6
Se qualche sviluppatore esterno guarda il tuo codice, quello che vedrà è solo la tua convenzione personale . Penso che per un progetto medio / grande, l'uso di una serie di convenzioni pensate per un tipo di progetto totalmente diverso potrebbe anche causare più confusione. È un'app di rotaie, un'app di rubino? Perché è progettato come un'app Rails? "Farò meglio a contattare lo sviluppatore prima di rompere qualcosa ...?" Aggiungerà un po 'di sovraccarico fin dall'inizio ..
jj_

Sono d'accordo con @jj_. So che questo è un po 'vecchio, ma penso che sia importante che le persone capiscano perché ci sono convenzioni della comunità. È così che puoi tirare qualcuno fuori dalla strada, potrebbero vedere il tuo progetto e scoppiare. È così che puoi cercare qualcosa e capirlo. Ritengo sia importante utilizzare le convenzioni del dominio. Convenzione di dominio sulla configurazione del progetto.
WattsInABox,

2

Se si utilizza il bundler, l'esecuzione di questo comando bundle gem app_namefornisce la stessa struttura di directory.

Se si desidera utilizzare rspec invece di unit test, è possibile eseguire questo comando rspec --init (accertarsi cd app_nameprima di tutto)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.