Structure de projet Ruby idéale

125

Je suis à la recherche d'un aperçu / clarification de la structure de projet idéale pour un projet ruby ​​(non-rails / merb / etc). Je suppose que ça suit

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

Est-ce que je me trompe? Quelles parties ai-je manquées?

dylanfm
la source
1
Je suggérerais d'utiliser le générateur Yeoman
Nishutosh Sharma

Réponses:

88

Je pense que c'est à peu près parfait. Par défaut, Rubygems ajoutera le répertoire lib au loadpath, mais vous pouvez pousser n'importe quel répertoire de votre choix sur celui-ci en utilisant la variable $:. c'est à dire

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

Cela signifie que lorsque vous avez dit, surfer.rbdans ce répertoire, vous pouvez require "surfer"n'importe où et le fichier sera trouvé.

De plus, par convention, les classes et les singletons obtiennent un fichier et les modules un répertoire. Par exemple, si vous aviez le LolCatzmodule et la LolCatz::Moarclasse qui ressembleraient à:

lib/
  appname.rb
  lolcatz/
    moar.rb

C'est pourquoi il existe un dossier lib / appname car la plupart des bibliothèques se trouvent dans l' appnameespace de noms.

De plus, si vous essayez d'exécuter la commande newgem --simple [projectname]qui générera rapidement un échafaudage pour vous avec juste l'essentiel pour un projet Ruby (et par extension un Ruby Gem). Il existe d'autres outils qui font cela, je sais, mais newgem est assez courant. Je me débarrasse généralement du fichier TODO et de tout le script.

Chris Lloyd
la source
1
doux. Je ne savais pas pour newgem. Mes projets non-rails ont souvent reflété la structure Rails parce que je l'ai trouvée familière. Merci pour ce conseil de bonnes pratiques.
berlin.ab
Un autre fichier important pourrait être "LICENCE"
bluehavana
2
Je n'obtiens pas le comportement que vous décrivez avec libl'ajout automatique au chemin de chargement. Est-ce une chose 1.9? Une configuration spéciale est-elle nécessaire pour que cela se produise?
Emily
5
Vous pouvez également utiliser bundle pour générer un modèle de gemme. newgem n'a pas été engagé depuis 9 mois au moment de ce commentaire. La commande estbundle gem gem_name
Ninjaxor
10

Voir l'exemple suivant de 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
la source
6

J'essaie d'imiter la structure du projet Rails parce que mon équipe, qui s'occupe généralement de Rails, comprendra la structure mieux qu'une autre configuration. Convention sur la configuration - saignement des rails.

berlin.ab
la source
6
Si un développeur externe regarde votre code, ce qu'il verra n'est que votre convention personnelle . Je pense que pour un projet de taille moyenne / grande, l'utilisation d'un ensemble de conventions destinées à un type de projet totalement différent pourrait même causer plus de confusion. Est-ce une application de rails, une application ruby? Pourquoi est-il conçu comme une application de rails? "Je ferais mieux de contacter le développeur avant de casser quelque chose ...?" Cela va ajouter un peu de frais généraux dès le début ..
jj_
Je suis d'accord avec @jj_. Je sais que c'est un peu vieux, mais je pense qu'il est important que les gens comprennent pourquoi il y a des conventions communautaires. C'est pour que vous puissiez retirer quelqu'un de la rue, il pourrait voir votre projet et se fissurer. C'est pour que vous puissiez rechercher quelque chose et le comprendre. Je pense qu'il est important d'utiliser les conventions du domaine. Convention de domaine sur la configuration du projet.
WattsInABox
2

Si vous utilisez bundler, exécuter cette commande bundle gem app_namevous donnera la même structure de répertoires.

Si vous souhaitez utiliser rspec au lieu de tests unitaires, vous pouvez ensuite exécuter cette commande rspec --init (assurez-vous simplement de cd app_namecommencer)

8bithero
la source