ruby-on-rails gem rails-engines gemfile

ruby-on-rails - gemfile format



Motores de Rails 3.1: Diferencia de my_engine.gemspec, add_dependency, add_development_dependency, y Gemfile (3)

Solo por curiosidad ... en mi anterior publicación Rails3.1: no puedo hacer que SLIM o HAML funcionen en la aplicación de prueba / dummy . Pregunté dónde decirle a Ruby que usara alguna gema en mi aplicación de test/dummy .

La respuesta (¿obvia?) Fue simplemente ponerlo en el Gemfile de mi Motor. Esto funciona, pero me hace sentir un poco incómodo porque en Yehuda Katz ''Post Clarifying the Roles of .gemspec and Gemfile menciona que ...

... al desarrollar una gema, el Gemfile "un gemfile de gema debe contener la fuente Rubygems y una sola línea de gemspec".

Por otro lado, dentro de mi Motor''s Gemfile (que fue generado usando el rails plugin new my_engine Rails '' rails plugin new my_engine ) hay:

# jquery-rails is used by the dummy application gem "jquery-rails"

Así que esto parece estar bien. Actualización: no, no lo hace! Mira mi respuesta a continuación ...

Aún así, en otra parte de StackOverflow veo que la solución para esto simplemente requiere la gema necesaria en config/application.rb , mientras que https://stackoverflow.com/questions/5159607/rails-engine-gems-dependencies-how- para cargarlos en la aplicación, se le lib/<your_engine>/engine.rb file que se coloque mejor en el lib/<your_engine>/engine.rb file .

Y aquí está mi pensamiento: ¿por qué la aplicación de test/dummy simplemente no requiere automáticamente todas las gemas especificadas en el archivo .gemspec ? Incluso le decimos a la gema, qué gemas usar para la producción y cuáles para el modo de desarrollo mediante el uso explícito de add_dependency y add_development_dependency , así que no veo ninguna razón por la que test/dummy no haga esto.

Así que aquí está la pregunta final: ¿Dónde tengo que decirle exactamente a Ruby que use una gema en mi aplicación de test/dummy ? NO QUIERO FORZAR A RUBY A USAR LA GEM TAMBIÉN EN LA APLICACIÓN HOST.


Creo que la forma correcta de proceder es la siguiente:

Un motor es una gema normal. Cuando desarrollas una gema, pones sus dependencias en el archivo gemspec . Si usa bundle, usted, como desarrollador, puede crear un archivo .lock con las versiones específicas que no tuvo problemas. Pero tener esas dependencias declaradas en la gemspec no es suficiente para usarlas, debes require en tu código de gema. Cuando se requieren, si la gema se usa con el paquete, se .lock versiones .lock .

En un motor, como cualquier otra gema, es lo mismo. Usted define sus dependencias en su archivo gemspec y ejecuta la bundle install pero no es suficiente usarlas. lib/my_engine.rb , por ejemplo, en lib/my_engine.rb .

Por ejemplo:

# File: my_engine.rspec # ... s.add_dependency `slim_rails`, '' ~>1.0''

# ...

# File: lib/my_engine.rb require "my_engine/engine" require "slim-rails" module MyEngine end

No estoy seguro de por qué se usan sin más problemas si están configurados en el Gemfile , pero como dice la documentación de los rieles :

Las dependencias de gemas dentro de un motor deben especificarse dentro del archivo .gemspec en la raíz del motor. La razón es que el motor puede ser instalado como una gema. Si las dependencias se especificasen dentro del Gemfile, estas no serían reconocidas por una instalación tradicional de gemas y, por lo tanto, no se instalarían, lo que causaría un mal funcionamiento del motor.


Esto es lo que descubrí hasta ahora.

Dentro de un motor (creado con el rails plugin new my_engine ), debe especificar las gemas necesarias solo en el archivo my_engine.gemspec, ya que se hace referencia a ellas desde test / dummy / Gemfile usando gemspec .

Aquí está el contenido de prueba / dummy / Gemfile generado:

source "http://rubygems.org" # Declare your gem''s dependencies in simple_view_helpers.gemspec. # Bundler will treat runtime dependencies like base dependencies, and # development dependencies will be added by default to the :development group. gemspec # jquery-rails is used by the dummy application gem "jquery-rails" # Declare any dependencies that are still in development here instead of in # your gemspec. These might include edge Rails or gems from your path or # Git. Remember to move these dependencies to your gemspec before releasing # your gem to rubygems.org. # To use debugger # gem ''debugger''

Lo que la línea gem "jquery-rails" está haciendo aquí, realmente no sé, parece contradecir completamente lo que se propone en los comentarios. Por otro lado, cuando estoy tratando de usar la gema SLIM (en lugar de ERB) en mi aplicación de prueba / dummy, parece que tengo que especificarla en el Gemfile, de lo contrario no funcionará. Todavía un poco confuso, estas cosas ...


TL; DR:

No uses ningún Gemfile cuando desarrolles un Motor. Ponga todo en la gemspec su motor y deje que el motor en sí requiera todo lo que necesita.

¿por qué la aplicación de prueba / dummy no requiere automáticamente todas las gemas especificadas en el archivo .gemspec?

Supongo que las aplicaciones no requieren automáticamente las dependencias de su motor por razones de rendimiento.

Entonces, si se supone que la aplicación ficticia es una simulación auténtica de una aplicación real que utiliza el motor, tampoco debería hacerlo.

Además, suponga que la aplicación ficticia requería automáticamente todas las dependencias, incluidas las dependencias de desarrollo. En ese caso, sus pruebas podrían tener éxito incluso si una de sus dependencias de desarrollo fuera realmente una dependencia de tiempo de ejecución. Eso sería realmente molesto.

se dice que simplemente requiere la gema necesaria en config / application.rb

Esto también podría enmascarar las dependencias de tiempo de ejecución de su motor, así que mejor no lo haga.

Así que aquí está la pregunta final: ¿Dónde tengo que decirle exactamente a Ruby que use una gema en mi aplicación de prueba / dummy? No quiero forzar a Ruby a usar la gema también en la aplicación host.

Si esa gema solo es necesaria para las pruebas, solicítela en su ayudante de pruebas / especificaciones.

De lo contrario, si esa gema es necesaria para que su motor se ejecute, realmente debería imponer su uso.

James: Esto me llevaría a creer que las dependencias del motor van en la gemspec, mientras que las dependencias de la aplicación ficticia se colocan en el Gemfile.

El talón del paquete de la aplicación ficticia en realidad hace referencia al Gemfile faltante de la aplicación ficticia. Así que supongo que se deja fuera a propósito. Y eso tiene perfecto sentido.

Piénselo de esta manera: cualquier cosa que haga para cambiar la aplicación ficticia llevaría a que las pruebas no se realicen en un contexto neutral y, por lo tanto, no sean representativas.

Si realmente quieres poder reutilizar tu motor y colocarlo en cualquier nueva aplicación Rails en blanco, tu aplicación ficticia debería ser exactamente eso: una aplicación Rails nueva en blanco.