2009-12-07 5 views
1

J'ai un problème pour créer un plugin Rails, appelons-le Mplug. Le plugin n'est pratiquement qu'une tâche rake, mais avec une bibliothèque utilisée par la tâche rake.Rails plugin nécessite des problèmes

Le problème consiste à exiger des fichiers. Disons que c'est la tâche rake:

namespace :mplug do 
    task :create do 
    Mplug::Indexer.new 
    end 
end 

Ceci ne reconnaîtra pas la constante Mplug. Donc j'ai pensé que je devais l'exiger.

require 'mplug' 

namespace :mplug do 
    task :create do 
    Mplug::Indexer.new 
    end 
end 

Mais alors j'obtiens ce message.

no such file to load -- mplug 

Donc, ok. Essayons de donner le chemin au plugin alors.

require 'vendor/plugins/mplug/lib/mplug' 

namespace :mplug do 
    task :create do 
    Mplug::Indexer.new 
    end 
end 

Cela fonctionne réellement. Cependant, sauf que je suppose que c'est une mauvaise façon de le faire, je dois maintenant exiger les fichiers dans mon plugin comme si j'étais dans la racine des rails. Par exemple:

module Mplug 
end 

require 'mplug/indexer' 

doit maintenant être:

module Mplug 
end 

require 'vendor/plugins/mplug/lib/mplug/indexer' 

que je ne veux pas faire bien sûr.

Existe-t-il une façon élégante de résoudre ce problème?

Merci!

Répondre

0

Une option consiste à utiliser le FICHIER constante, puis fournir le reste du chemin relatif au fichier actuel:

require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'mplug') 

(si votre fichier de tâche Rake est dans vos plugin_root/tâches ..

+0

... Eh bien Comment puis-ce que les déclarations contenues dans le besoin fournisseur/plugins/Mplug/lib/mplug.rb être? Je dois encore faire comme ceci dans ce fichier: require 'vendeur/plugins/mplug/lib/mplug/indexer' – rejeep

+0

La plupart des plugins utilisent init.rb pour requérir des fichiers quand Rails démarre. Je vous suggère de consulter ce Guide Rails: http://guides.rubyonrails.org/plugins.html Il donne les meilleures pratiques pour structurer vos répertoires de plugins de rails, init.rb, nécessite, etc. – jkrall

2

La solution la plus simple à ce problème serait d'enregistrer la tâche rake en utilisant l'API Rails :: Railtie. En lib/mplug.rb, définir votre Railtie:

module Mplug 
    class Railtie < ::Rails::Railtie 
    rake_tasks do 
     load "mplug/rails.rake" 
    end 
    end 
end 

Puis, en lib/mplug/rails.rake:

namespace :mplug do 
    task :create do 
    Mplug::Indexer.new 
    end 
end 

Ensuite, assurez-vous que votre plugin est défini dans votre Gemfile. Si votre plugin est vendor/plugins, ajoutez cette ligne à votre Gemfile:

gem "mplug", :path => "vendor/plugins/mplug" 

Si vous appuyez sur le plug-in à un git, utilisez :git.

Maintenant, rake mplug:create sera disponible! Si vous souhaitez qu'il apparaisse dans rake -T, assurez-vous d'ajouter une description:

namespace :mplug do 
    desc "creating an mplug" 
    task :create do 
    Mplug::Indexer.new 
    end 
end