Comment configurer un projet Ruby de base?

103

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 cadre de test.

Je pourrais vouloir construire un bijou plus tard, mais ce n'est pas certain.

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

Les questions que j'ai sont:

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

Je sais que je pourrais tout faire à partir de zéro, mais j'aimerais avoir des conseils. Il y a de bons joyaux que je pourrais copier, mais je ne suis pas sûr 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 avoir configuré Bundler.

ayckoster
la source

Réponses:

156

Pour obtenir un bon départ, vous pouvez utiliser la bundle gemcommande 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 entre lib
  • les spécifications entrent spec
  • les données de test ou les documents entrent spec/fixtures/
  • Exigez tous vos fichiers ruby ​​au format 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 entrent ext/my_lib
  • les scripts shell et les exécutables entrent bin

En cas de doute, regardez comment les autres gemmes sont disposées.


Informations complémentaires:

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

  1. Modifiez my_lib.gemspec, en ajoutant gem.add_development_dependency 'rspec'et gem.add_development_dependency 'rake'près du bas.
  2. Ajoutez Bundler.setupet require 'my_lib'en haut de spec / spec_helper.rb pour vous assurer que vos dépendances de gem sont chargées lorsque vous exécutez vos specs.
  3. Ajoutez require "rspec/core/rake_task"et task :default => :specà votre fichier Rakefile, de sorte que l'exécution rakeexécutera vos spécifications.

Pendant que vous travaillez sur votre dernière création, guard-rspec peut vous faire gagner du temps et des tracas en exécutant automatiquement vos spécifications à mesure que les fichiers changent, vous alertant en cas d'échec des spécifications.

~/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, poussez-la vers 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

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

~/code/my_lib $ rake release

Références supplémentaires

John Douthat
la source
1
vous pouvez utiliser -b, [--bin=Generate a binary for your library.]avec bundle gem.
Selman Ulug
Vous pouvez également utiliser bundle gem <gem-name> -tpour faire l'équivalent de rspec --inittout à la fois.
pioto
1
Comment exécuter le projet ruby. J'ai construit un projet ruby ​​basé sur une console pour l'emploi du temps des élèves-enseignants. Vous ne savez pas comment l'exécuter?
rAzOr
11

Il y a quelques bons guides sur rubygems.org qui vous présenteront les conventions et le raisonnement derrière certaines d'entre elles. En général, les conventions de dénomination et de répertoire Rubygems sont suivies par la plupart des développeurs Ruby.

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

class Parser::Error < RuntimeError; end

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

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

Bundlerest 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 Gemfileet éventuellement le gemspec. Il vous permet également de facilement requirevotre code sans en faire un bijou.

Cependant, comme vous pourriez regrouper votre code dans un bijou à l'avenir, je vous recommande d'étudier comment créer des spécifications de gemme . Vous devez é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 les informations et font des ravages lorsqu'ils sont utilisés avec le contrôle de code source.

J'ai créé un bijou que vous trouverez peut-être utile. Compte tenu d' un gemspecfichier, il définit de nombreuses utiles Raketâches pour travailler avec votre bijou, qui comprennent des tâches pour la construction, l' installation et de libérer votre bijou à rubygemset gitdépôt avec le marquage automatique de la version. Il fournit également un moyen simple de charger votre code dans une session irbou pry.

# Rakefile
require 'rookie'

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

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

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

Dans lib /, la convention est généralement de créer un dossier pour chaque sous-espace de noms à l'intérieur de votre espace de noms de niveau supérieur. 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 juste 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 pour tester, construire et pousser la gemme).
  • / Gemfile - Définit la source de la gemme (entre autres choses possibles).
  • /foo.gemspec - Décrit votre gemme et fournit une liste de dépendances.
user2398029
la source
5

Il existe des guides sur Internet sur la manière de structurer un projet Ruby. En outre, je pense que la meilleure façon de résoudre ce problème est de se diriger vers github et de rechercher un projet Ruby célèbre, et de vérifier "leurs" structures.

Outre les exigences générales en matière de gemmes rubis, je recommande les outils suivants pour un meilleur flux de travail:

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

Et en plus de tous les outils ci-dessus, il s'agit d'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 quelqu'un.

Xiao Hanyu
la source