2011-03-01 9 views
45

Estoy haciendo un motor aquí, funciona bien solo.Motor de rieles: dependencias de gemas, ¿cómo cargarlas en la aplicación?

Cuando lo transformo en una gema, y ​​lo cargo dentro de otra aplicación, recibo muchos errores indefinidos, provenientes de las dependencias de mi motor.

Aquí es el gemspec:

s.add_dependency('paperclip') 
s.add_dependency('jquery-rails') 
s.add_dependency('rails3-jquery-autocomplete') 
s.add_dependency('remotipart') 
s.add_dependency('cancan') 

En la aplicación, cuando hago un paquete de instalación, se enumeran todas estas dependencias, pero mientras corro la aplicación que recibe una gran cantidad de errores métodos no definidos (has_attachment de clip de papel, por ejemplo). Parece que la aplicación no carga las dependencias de los motores. ¿Es este el comportamiento predeterminado? ¿Puedo cambiarlo? Lo mismo sucedió con un complemento dentro del motor.

Si inserto manualmente esas joyas, en la aplicación Gemfile, todas las obras ...

+0

¿Puedes ver estos instalados en Gemfile.lock en la aplicación? ¿Su motor Gemfile usa 'gemspec' debajo de la fuente? Si su aplicación Gemfile.lock muestra estas dependencias instaladas, entonces creo que deberían estar disponibles en la aplicación. Si no has visto esta publicación, compruébalo -> http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/ – johnmcaliley

Respuesta

69

incluirlos en su Gemfile y ejecutar bundle instalar. Luego, solicítelos en su lib/<your_engine>/engine.rb file. No se olvide de requerir rubygems

require 'rubygems' 
    require 'paperclip' 
    require 'jquery-rails' 
    require 'rails3-jquery-autocomplete' 
    require 'remotipart' 
    require 'cancan' 

Luego, en su aplicación host (La aplicación en la que haya incluido su joya) manojo de ejecución de instalación/actualización del paquete (paquete de actualización hizo el truco para mí) y entonces todo debería funcionar perfectamente. También puede probar esto iniciando la consola en su aplicación de host y simplemente escriba el nombre del módulo, p. Ej.

Loading development environment (Rails 3.0.3) 
irb(main):001:0> Paperclip 
=> Paperclip 

Esperanza esto ayuda

+3

La intención del OP es * no * se requiere agregar las dependencias en el Gemfile de la aplicación que usa el motor. (Estoy teniendo los mismos problemas con un complemento.) Todas las gemas aparecen en Gemfile.lock, pero parece que no están cargadas por Rails automáticamente. – davemyron

+1

Si las gemas están instaladas, solicítelas en su archivo lib/ /engine.rb. –

+4

@orangechicken - Creo (tal vez erróneo) es su responsabilidad de motor/complementos para requerir cualquier dependencia. Que también debería incluirse en gemspec. Creo que el Gemfile es solo para fines de desarrollo. – Kris

0

En el momento (Rails 3.1 y superior creo), que no debería tener ningún declaramos gemas en la prueba/maniquí/Gemfile más:

Cita de prueba/maniquí/Gemfile (generada usando rails plugin new my_engine --full):

Declarar dependencias de su joya en simple_view_helpers.gemspec. Bundler tratará dependencias de tiempo de ejecución como dependencias base, y las dependencias de desarrollo se agregarán de forma predeterminada al grupo de desarrollo.

Declare las dependencias que aún están en desarrollo aquí en lugar de en su gemspec. Estos pueden incluir rieles de borde o gemas de su ruta o Git. Recuerde mover estas dependencias a su gemspec antes de liberar su gema a rubygems.org.

0

Realmente no debería necesitarlos en el Gemsec, y deberían cargarse. Cuando dice "aquí está el gemspec", lo rodea con Gem::Specification.new do |s| o algo por el estilo, ¿verdad?

1

de un clip de README:

para uso no-Rieles:

class ModuleName < ActiveRecord::Base 
    include Paperclip::Glue 
    ... 
end 

que tenían el mismo problema y que se fije por mí.

23

Puede solicitarlos manualmente como Daniel publicó, y también puede solicitarlos automáticamente.Es necesario añadir dependencias en 3 archivos:

  • yourengine.gemspec

    s.add_dependency "rails", '4.1.0' 
    s.add_dependency "sqlite3" 
    
  • Gemfile

    # Imports dependencies from yourengine.gemspec 
    gemspec 
    
  • lib/yourengine.rb

    # requires all dependencies 
    Gem.loaded_specs['yourengine'].dependencies.each do |d| 
    require d.name 
    end 
    
    require 'yourengine/engine' 
    
    module Yourengine 
    end 
    
+3

Esto es bastante limpio. Desafortunadamente, algunas gemas tienen diferentes convenciones de nomenclatura y, por lo tanto, 'require d.name' fallará con' LoadError', por lo que es posible que tengas que hacer un poco de rescate. –

+1

Ese último bucle va a cargar todas sus dependencias de desarrollo, también. :( –

1

Debe agregar el archivo gem al archivo .gemspec y al archivo engine.rb. En el archivo .gemspec Sería como: s.add_dependency "kaminari", "0.16.1"

En el archivo engine.rb en la parte superior complemento: require "kaminari"

Creo que también hay que añadir la gema para el motor y el paquete de rieles Gemfile instalar, pero no estoy seguro si lo necesita allí.

0

Puede incluir todas las gemas para el medio ambiente con un simple comando bundler:

Bundler.require(*Rails.groups) 

Se podría añadir esto a un config/initializer.

Cuestiones relacionadas