web-dev-qa-db-fra.com

Y compris les tâches de râteau dans les gemmes

1) Y a-t-il un "meilleur" endroit pour les tâches de râteau à l'intérieur des gemmes? Je les ai vus dans /tasks, /lib/tasks, et je les ai vus écrites comme *.rb et *.rake - Je ne sais pas quoi (le cas échéant) est "correct"

2) Comment puis-je les mettre à la disposition de l'application une fois que le gemme est configuré dans l'environnement?

59
jsharpe

ON Rails 3, vous faites ceci via des rails. Voici le code pour le faire pour un joyau que je viens de faire:

class BackupTask < Rails::Railtie
  rake_tasks do
    Dir[File.join(File.dirname(__FILE__),'tasks/*.rake')].each { |f| load f }
  end
end

Donc, vous créez essentiellement une classe qui hérite de Rails::Railtie, alors dans cette classe, vous avez un rake_tasks Block qui charge les fichiers pertinents. Vous devez charger au lieu d'exiger si vous souhaitez utiliser un .rake extension.

J'ai trouvé que j'ai besoin de spécifier le chemin complet de Dir (d'où le File.join gymnastique). Si je voulais juste énumérer le fichier explicitement, je pourrais sortir avec juste dire load 'tasks/foo.rake' parce que le /lib dir de ma gemme était dans le chemin de charge.

44
edebill

Soit /tasks et lib/tasks sont un bon endroit. J'utilise /tasks Lorsque les tâches sont censées être utilisées pour travailler ou gérer la gemme elle-même, j'utilise lib/tasks Lorsque les tâches sont censées être chargées par les utilisateurs de GEM.

En effet, les utilisateurs peuvent avoir un problème dans le chargement Ruby en dehors du dossier lib qui est automatiquement ajouté au chemin de charge lorsque le gemme est requis.

De plus, je vous suggère d'utiliser la * extension .Rake. De nos jours, presque tous IDE Associates .rake extension to Ruby fichiers et le plus avancé IDE peut même analyser le contenu en tant que scripts Rake. Le .rake L'extension est également un meilleur choix pour les développeurs, car vous pouvez fournir une vue d'ensemble immédiate du contenu dans le fichier.

À propos de votre deuxième question, il n'existe actuellement aucun moyen d'avoir Rails Chargement de vos tâches Rake lorsque le plugin est emballé comme GEM. Vous devez inclure le fichier RAKE dans votre application (dans un autre fichier de râteau ou dans le microfile principal) ou clonez les tâches du râteau de votre projet.

Si vous installez le plugin dans le dossier du fournisseur, tout *.rake Les fichiers dans les deux tâches et les répertoires lib/tâches sont automatiquement chargés dans votre Rails Portée par les deux lignes suivantes.

Dir["#{Rails_ROOT}/vendor/plugins/*/tasks/**/*.rake"].sort.each { |ext| load ext }
Dir["#{Rails_ROOT}/vendor/plugins/*/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
31
Simone Carletti

pour Rails 3 Support, la ligne supérieure de votre fichier lib/.rb peut être:

Dir["tasks/**/*.rake"].each { |ext| load ext } if defined?(Rake)

pour Rails 2 Support, l'installateur de GEM devra éditer leur filfime et ajouter:

Dir["#{Gem.searcher.find('<gemname>').full_gem_path}/lib/tasks/**/*.rake"].each { |ext| load ext }

après les déclarations requises.

REMARQUES:

  • Assurez-vous de remplacer par le nom de votre gemme réelle.
  • Cela assume toutes les tâches Rails-visibles Rake sont en lib/tâches /

Je n'ai encore rien trouvé encore. Commentaires?

12
Steven Soroka