2010-11-21 26 views
10

J'ai écrit un plugin qui nécessite une gemme comme dépendance.Rails 3: définir la dépendance du plugin gem

Où dois-je définir cette dépendance?

J'ai essayé de créer un Gemfile dans le fournisseur/plugins/my_plugin /, mais bundle install ne trouve pas ce fichier.

Répondre

16

Ok. J'ai résolu.

1) Créer une Gemfile dans vendor/plugins/my_plugin comme:

# Gemfile 
source "http://rubygems.org" 
gemspec 

2) Créer un gemspec fichier. Dans le dossier fournisseurs/plugins exécuter cette commande:

bundle gem my_plugin 

(Notez que cette commande vous demande de remplacer certains fichiers Vérifiez les fichiers avant réponse. Y)

3) Ouvrir gemspec fichier dans vendor/plugins/my_plugin/et ajouter avant la fin mot-clé:

s.add_dependency('will_paginate', '~> 3.0.pre2') 

(dans cet exemple, j'ai utilisé will_paginate comment requi dipendency rouge my_plugin)

4) Maintenant, allez dans votre application Rails et modifier Gemfile, ajouter:

gem 'my_plugin', :path=>'vendor/plugins/my_plugin' 

Le chemin spécifié supposé que votre plug-in est déjà dans le dossier vendor/plugins de votre rails app. Bien sûr, lorsque vous déployez l'application rails, vous n'avez plus besoin de spécifier : chemin argument.

5) maintenant dans des rails racine app faire:

bundle install 

Et dépendance de my_plugin (will_paginate dans ce cas) est installé.

Merci à Sinetris pour l'entrée initiale.

+4

J'ai un problème similaire, mais dans mon cas ce n'est pas un plugin, c'est un moteur/gemme. J'ai fait comme tu l'as dit, le 'bundle install' installe les gems en tant que dépendances. Mais il semble que l'application ne charge pas ces gemmes, ou ne les initialise pas, causant des erreurs de méthodes indéfinies partout. Le moteur fonctionne tout seul. Avez-vous une idée de ce qui pourrait manquer? – Tiago

+3

J'ai le même problème que Tiago, mais le mien * est * un plugin. 'bundle install' installe toutes les dépendances - je les vois dans Gemfile.lock - mais elles ne sont pas chargées par Rails. Qu'est-ce qui manque? – davemyron

+0

J'ai dû déplacer mon init.rb vers rails/init.rb qui doit être chargé après le chargement de l'application rails. J'ai aussi eu des problèmes pour accéder à 'Rails.root' lors du chargement du code de la librairie, je l'ai résolu en déplaçant du code init vers rails/init.rb. –

0

Gemfile dans le dossier de l'application.

# Bundle the extra gems: 
# gem 'bj' 
# gem 'nokogiri' 
# gem 'sqlite3-ruby', :require => 'sqlite3' 
# gem 'aws-s3', :require => 'aws/s3 
+0

J'ai besoin de spécifier la dépendance des pierres précieuses pour le plugin, et non pour l'application – Sebtm

2

Créer une Gemfile dans votre fournisseur/plugins/my_plugin/comme:

# Gemfile 
source "http://rubygems.org" 
gemspec 

gem "your-dependency-gem-name" 

note la directive gemspec. Pour plus d'informations, consultez Using Bundler with Rubygem gemspecs pour plus d'informations.

+0

Ok. J'ai peut-être commencé à partir de l'hypothèse erronée que la commande 'bundle install' cherchait dans le dossier vendeur/plugins et résolvait les dépendances au moment du développement du plugin. Si je comprends bien maintenant, je dois d'abord faire une gemme de mon plugin et ses dépendances seront résolues quand mon plugin sera installé. Droite? – Sebtm

0

Référence pour moi-même.Si vous créez un plugin qui devrait fonctionner avec Rails en RailTie, utilisez rails plugin my_plugin pour créer la gemme au lieu de bundle gem my_plugin. Cela vous évite beaucoup d'ennuis. Editer: Quand avez-vous besoin de la gemme pour travailler comme RailTie? Chaque fois que vous voulez ajouter générateur de rails, rake tâches ou ajouter votre code à une application Rails (appelé Rails Engine). /Modifier

$ rails plugin new my_plugin 

vous ajouter des dépendances

Gem::Specification.new do |s| 
    #... 
    s.add_dependency "rails" 
    s.add_runtime_dependency "heroku" 
    s.add_development_dependency "sqlite3" 
end 

pour l'inclure dans votre application Rails, utilisez path: comme décrit par @Sebtm

ou à libérer rubygems.

$ gem build my_plugin.gemspec 
$ gem push my_plugin-0.7.0.gem #replace version number 
#in Gemfile, as always 
gem 'my_plugin' 

ou de le marquer sur github. (Utiliser leur interface utilisateur de libération) et dépendent de l'aide

gem 'my_plugin', github: 'accountname/my_plugin', tag: 'v0.7.0' 
+0

Si vous en avez besoin pour travailler comme RailTie for Rails. Quand le veux-tu? Chaque fois que vous voulez ajouter ** rails generator **, ** rake tasks ** ou ajouter votre code à une application Rails (appelé * Rails Engine *). Si vous n'en avez pas besoin, n'utilisez pas 'rails plugin'. – oma