web-dev-qa-db-fra.com

Comment configurer un projet de base Ruby?

Je veux créer un petit projet Ruby avec 10 ~ 20 classes/fichiers. J'ai besoin de quelques gemmes et je veux utiliser RSpec comme framework de test.

Je pourrais vouloir construire un joyau plus tard, mais ce n’est pas certain.

Existe-t-il un guide ou un guide qui me montre comment configurer la structure de base de mon projet?

Les questions que j'ai sont:

  • Où dois-je placer toutes mes erreurs/exceptions personnalisées?
  • Existe-t-il des conventions permettant de nommer des répertoires tels que lib, bin, src, etc.?
  • Où dois-je mettre les données de test ou les documents?
  • Où ai-je besoin de tous mes fichiers pour y avoir accès dans mon projet?

Je sais que je peux tout faire à partir de rien, mais j'aimerais des conseils. Je pourrais copier quelques bonnes perles, mais je ne suis pas certain de ce dont j'ai vraiment besoin et de ce que je peux supprimer.

J'ai regardé http://gembundler.com/ , mais il s'arrête après la configuration de Bundler.

96
ayckoster

Pour bien commencer, vous pouvez utiliser le bundle gem commande et 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
  • le code va dans lib
  • les spécifications vont dans spec
  • les données de test ou les documents vont dans spec/fixtures/
  • Exiger tous vos fichiers Ruby dans lib/my_lib.rb. Vous pouvez également définir vos exceptions dans ce fichier ou dans leurs propres fichiers, selon vos préférences.
  • Les fichiers source C vont dans ext/my_lib
  • Les scripts shell et les exécutables vont dans bin

En cas de doute, il suffit de regarder comment les autres gemmes sont disposées.


Informations complémentaires:

Vous devez ajouter rspec en tant que dépendance de développement dans votre gemspec pour faciliter les choses pour les autres développeurs.

  1. Editez my_lib.gemspec en ajoutant gem.add_development_dependency 'rspec' et gem.add_development_dependency 'rake' près du bas.
  2. Ajouter Bundler.setup et require 'my_lib' au début de spec/spec_helper.rb pour vous assurer que vos dépendances de gem sont chargées lors de l’exécution de vos spécifications.
  3. Ajouter require "rspec/core/rake_task" et task :default => :spec vers votre fichier Rakefile, de sorte que l'exécution de rake exécute vos spécifications.

Pendant que vous travaillez sur votre nouvelle création, guard-rspec peut vous faire gagner du temps et vous faciliter la vie de automatiquement en exécutant vos spécifications en tant que les fichiers changent, vous alertant des échecs de spécification.

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

Une fois que vous êtes satisfait de votre création, appuyez sur 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 [email protected]:myusername/my_lib.git
~/code/my_lib $ git Push

Ensuite, lorsque vous êtes prêt à publier votre bijou sur Rubygems.org, exécutez rake release, qui vous guidera à travers les marches.

~/code/my_lib $ rake release

Références supplémentaires

151
John Douthat

Il y a quelques guides de Nice sur rubygems.org qui vous initiera aux conventions et au raisonnement derrière certaines d'entre elles. En général, les conventions de dénomination et de répertoire Rubygems sont suivis par la plupart des Ruby).

Je ne créerais des classes d'exception personnalisées que si je ne pouvais trouver aucune classe dans la bibliothèque standard qui corresponde à la description de l'erreur. Emboîtez votre classe d'erreur sous la classe ou le module qui la soulève:

class Parser::Error < RuntimeError; end

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

Les tests unitaires vont soit en /test, si vous utilisez Test::Unit , ou dans /spec si vous utilisez RSpec . Je recommande ce dernier.

Bundler est un excellent moyen de gérer votre chemin de chargement. Il configurera automatiquement votre environnement avec uniquement les dépendances spécifiées sur le Gemfile et éventuellement sur le gemspec. Il vous permet également de facilement require votre code sans en faire un joyau.

Cependant, étant donné que vous pourriez regrouper votre code dans une gemme à l'avenir, je vous recommande de rechercher comment créer des spécifications de gem . Vous devriez écrire votre spécification manuellement. N'utilisez pas un outil pour le générer automatiquement - ce sont, à mon avis, des approches de force brute qui dupliquent inutilement des informations et font des ravages lorsqu'elles sont utilisées avec le contrôle de source.

J'ai créé une gemme que vous pouvez trouver utile. Avec un fichier gemspec, il définit de nombreuses tâches Rake utiles pour travailler avec votre gemme, notamment les tâches de construction, d'installation et de publication de votre gem sur rubygems et git référentiel avec marquage de version automatique. Il fournit également un moyen simple de charger votre code dans une session irb ou pry.

# Rakefile
require 'rookie'

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

Voici les conventions que j'ai le plus souvent vues (en supposant que le nom de votre projet est "foo"):

  • /lib/foo.rb - Définit l'espace de noms de premier niveau du projet et sa version; nécessite des fichiers nécessaires.
  • / lib/foo/- Contient toutes les classes de votre projet, y compris les classes relatives aux erreurs.
  • / test/- Contient des tests pour votre projet.
  • / spec/- Contient les spécifications de votre projet.
  • / bin/- Si votre projet dépend de fichiers binaires (fichiers JAR, etc.), ils y sont généralement insérés.

Dans lib /, la convention est généralement de créer un dossier pour chaque sous-espace de noms dans votre espace de noms de premier niveau. Par exemple, la classe Foo :: Bar :: Baz se trouve généralement sous /lib/foo/bar/baz.rb.

Certaines personnes aiment créer un fichier /lib/foo/version.rb uniquement pour définir la constante Foo :: VERSION, mais très souvent, j'ai vu cela défini dans le fichier /lib/foo.rb.

De plus, si vous créez une gemme, vous aurez besoin des fichiers suivants:

  • / Rakefile - Définit les tâches de rake (telles que les tâches de test, de construction et de transfert de la gemme).
  • / Gemfile - Définit la source de la gemme (entre autres choses possibles).
  • /foo.gemspec - Décrit votre bijou et fournit une liste de dépendances.
6
user2398029

Il existe quelques guides sur Internet sur la façon de structurer un projet Ruby. En outre, je pense que le meilleur moyen de résoudre ce problème est de vous rendre sur github et de rechercher des noms célèbres Ruby projet, et vérifiez "leurs" structures.

Outre les exigences générales Ruby gem, je recommande les outils suivants pour un meilleur flux de travail:

  • editorconfig , aide les développeurs à définir et à conserver des styles de codage cohérents entre différents éditeurs et IDE.
  • rubocop , analyseur de code statique pour Ruby, le defac de linter dans Ruby communauté.
  • guard , avec un tas de plugins, vous pouvez exécuter toutes les commandes comme bon vous semble lorsque le code change, automatiquement.
  • rake , le pilote universel pour diverses tâches du projet, telles que:
    • package: construire le paquet Gem
    • clean: nettoie les fichiers générés
    • test: lancer le test
  • yard , populaire Ruby.

Et en plus de tous les outils ci-dessus, il existe un service en ligne pour le projet Ruby:

Et vous pouvez même générer des badges via http://shields.io/ pour votre projet open source.

C'est mon expérience, j'espère que cela aidera pour quelqu'un.

4
Xiao Hanyu