2011-08-05 20 views
11

que tienen una aplicación Rails 3 que me estoy convirtiendo en un motor de rieles/joya. Este motor tiene algunas dependencias de gemas que he puesto dentro de su archivo .gemspec.¿Cómo puedo hacer dependencias gemspec carga automática en una aplicación Rails 3, utilizando un Gemfile

He creado una nueva aplicación 'padre' de Rails 3, y me gustaría agregar mi gema del motor al Gemfile y tener las dependencias de la gema 'cargadas' automáticamente, ¡pero esto no funciona para mí! bundle install instala las dependencias de la gema bien, pero cuando inicio el servidor, la aplicación se cuelga porque no están cargadas.

Por ejemplo, gemspec de mi motor contiene estas líneas:

s.add_runtime_dependency(%q<rails>, ["= 3.0.7"]) 
s.add_runtime_dependency(%q<acts_as_commentable>, [">= 3.0.1"]) 
s.add_runtime_dependency(%q<haml>, [">= 3.1.1"]) 

.. y los rieles de padres 3 aplicación dispone de estas líneas en su Gemfile:

source 'http://rubygems.org' 

gem 'my_engine', :path => "~/src/gems/my_engine" 

pero me da el siguiente error:

undefined local variable or method `acts_as_commentable' 
from /home/user/src/gems/my_engine/app/models/account.rb:66:in `<class:Account>' 

Pero si añado gem 'acts_as_commentable', '>= 3.0.1' a la Gemfile de los rieles de padres 3 aplicación, luego se carga la gema y el error desaparece.

Estoy usando Rails 3.0.8.

¿Alguien tiene alguna sugerencia? ¿Debo cambiar algo sobre la forma en que mi motor se está cargando?

Respuesta

12

Durante los rieles principales de arranque de aplicaciones, Bündler sólo requerirá dependencias directamente enumerados en el Gemfile pero no cualquier sub-dependencias. Es responsabilidad de su biblioteca/motor solicitar sus dependencias cuando sea necesario. Puede hacerlo usando inicializadores en su Railtie.

class MyRailtie < Rails::Railtie 
    initializer "require stuff" do 
    require "stuff" 
    end 
end 
+0

Muchas gracias por confirmar que este es el comportamiento esperado. Hay un problema cerrado (rechazado) en el paquete con la idea de 'Gemfiles recursivos', que suena como que podría haber sido útil: https://github.com/carlhuda/bundler/issues/49 – ndbroadbent

+0

Para mí necesitaba requerir en /lib/my_engine.rb. Ejemplo: https://github.com/krisleech/qwerty/commit/c1e82cef27013afc6a540412e101cc2b6aeb4898 – Kris

2

estoy mirando Spree (el superhéroe de los carriles motores!), Y hacer esto en spree_core-0.60.1/lib/spree_core.rb:

require "rails/all" 

require 'state_machine' 
require 'paperclip' 
require 'stringex' 
require 'will_paginate' 
require 'nested_set' 
require 'acts_as_list' 
require 'resource_controller' 
require 'active_merchant' 
require "meta_search" 
require "find_by_param" 

Así que la respuesta es que dentro de su joya, tiene que requerir toda ella es la gema dependencias una a una. Bueno, así es como lo haré por ahora. Pero por favor comente si esto alguna vez cambia en el futuro.

1

parece que no funcionan, creo un proyecto de acogida y un sub-proyecto con carriles de 3 motor.

Agregado de la gema para gemspec

s.add_dependency 'simple_form'

motor

continuación, añade la requieren para engine_name.rb, como a continuación

require 'simple_form'

Pero si eliminar la línea [joya 'simple_form'] en Gemfile del proyecto de acogida, se mostrará inmediatamente indefinido

3

En nuestro motor de rieles usamos un pequeño truco para requerir dependencias automáticamente. Lamentablemente no se puede especificar si deben cargarse en .gemspec, lo que permitiría un mayor control.

Gem.loaded_specs["our_rails_engine"].dependencies.each do |d| 
    begin 
    require d.name 
    rescue LoadError => le 
    # Put exceptions here. 
    raise le if d.name !~ /factory_girl_rails/ 
    end 
end 
+0

Eso funciona muy bien, aunque en su lugar estoy haciendo 'runtime_dependencies'. –

Cuestiones relacionadas