ruby-on-rails autoload ruby-on-rails-5

ruby on rails - Rails 5: cargar archivos lib en producción



ruby-on-rails autoload (9)

He actualizado una de mis aplicaciones de Rails 4.2.6 a Rails 5.0.0. La Guía de actualización dice que la función de carga automática ahora está desactivada en producción de forma predeterminada.

Ahora siempre recibo un error en mi servidor de producción ya que cargo todos los archivos lib con carga automática en el archivo application.rb .

module MyApp class Application < Rails::Application config.autoload_paths += %W( lib/ ) end end

Por ahora, configuré config.enable_dependency_loading en true pero me pregunto si hay una mejor solución para esto. Debe haber una razón por la que la carga automática está desactivada en la producción de forma predeterminada.


Debe haber una razón por la que la carga automática está desactivada en la producción de forma predeterminada.

Aquí hay una larga discusión sobre este tema. Github


Acabo de usar config.eager_load_paths lugar de config.autoload_paths como mencionar akostadinov en el comentario de github: https://github.com/rails/rails/issues/13142#issuecomment-275492070

# config.autoload_paths << Rails.root.join(''lib'') config.eager_load_paths << Rails.root.join(''lib'')

Funciona en entornos de desarrollo y producción.

¡Gracias Johan por su sugerencia de reemplazar #{Rails.root}/lib con Rails.root.join(''lib'') !


En cierto sentido, aquí hay un enfoque unificado en Rails 5 para centralizar la configuración ansiosa y de carga automática, al mismo tiempo que agrega la ruta de carga automática requerida cada vez que se configura la carga ansiosa; de lo contrario, no podrá funcionar correctamente:

# config/application.rb ... config.paths.add Rails.root.join(''lib'').to_s, eager_load: true # as an example of autoload only config config.paths.add Rails.root.join(''domainpack'').to_s, autoload: true ...


Esto permite tener una carga automática de lib, y también funciona en un entorno de producción.

PD: He cambiado mi respuesta, ahora se agrega a las dos rutas de carga automática y ansiosa, independientemente del entorno, para permitir trabajar también en entornos personalizados (como la etapa)

# config/initializers/load_lib.rb ... config.eager_load_paths << Rails.root.join(''lib'') config.autoload_paths << Rails.root.join(''lib'') ...


La carga automática está desactivada en el entorno de producción debido a la seguridad del hilo. Gracias a @ Зелёный por el enlace.

Resolví este problema almacenando los archivos lib en una carpeta lib en el directorio de mi app como se recomienda en Github . Rails carga automáticamente todas las carpetas de la app .


Mi lista de cambios después de pasar a Rails 5:

  1. Coloque lib dir en la app porque todo el código dentro de la aplicación se carga automáticamente en el desarrollador y se carga con entusiasmo en la producción y, lo más importante, se carga automáticamente en el desarrollo para que no tenga que reiniciar el servidor cada vez que realice cambios.
  2. Elimine cualquier declaración require que apunte a sus propias clases dentro de lib porque todas se cargan automáticamente de todos modos si sus nombres de archivo / directorio son correctos, y si deja las declaraciones require , puede interrumpir la recarga automática. Más información here
  3. Establezca config.eager_load = true en todos los entornos para ver los problemas de carga de código con entusiasmo en dev.
  4. Utilice Rails.application.eager_load! antes de jugar con hilos para evitar errores de "dependencia circular".
  5. Si tiene extensiones de ruby ​​/ rails, deje ese código dentro del antiguo directorio lib y cárguelos manualmente desde el inicializador. Esto asegurará que las extensiones se carguen antes de su lógica adicional que puede depender de ella:

    # config/initializers/extensions.rb Dir["#{Rails.root}/lib/ruby_ext/*.rb"].each { |file| require file } Dir["#{Rails.root}/lib/rails_ext/*.rb"].each { |file| require file }


Mover la carpeta lib a la aplicación ayudó a resolver un problema, mi API de Twitter no se ejecutaba en producción. Tenía "TwitterApi constante sin inicializar" y mi API de Twitter estaba en mi carpeta lib. Tenía config.autoload_paths += Dir["#{Rails.root}/app/lib"] en mi application.rb pero no funcionó antes de mover la carpeta.

Esto hizo el truco



para resumir la respuesta de Lev: la mv lib app fue suficiente para cargar y cargar automáticamente todo mi código lib .

(Rails 6.0.0beta3 pero también debería funcionar bien en rails 5.x)