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 application.rb
archivo.
module MyApp
class Application < Rails::Application
config.autoload_paths += %W( lib/ )
end
end
Por ahora, me he fijado la config.enable_dependency_loading
que true
pero me pregunto si hay una mejor solución a esto. Debe haber una razón por la que la carga automática está desactivada en la producción de forma predeterminada.
lib
dir, un archivo está fácilmente disponible en tiempo de ejecución, pero otro tiene que ser requerido manualmente: DValidators
) en carpetas directamente en la aplicación / directorio ya que el código allí se carga automáticamente.app/services/paylinx/paylinx_service.rb
Definición de clase:module Paylinx class PaylinxService end end
. Probé estasautoload_paths
cosas. no funciona para miRespuestas:
Mi lista de cambios después de pasar a Rails 5:
lib
dir enapp
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.require
declaraciones que apunten a sus propias clases en el interiorlib
porque todas se cargan automáticamente de todos modos si su nombre de archivo / directorio es correcto, y si dejarequire
declaraciones, puede interrumpir la recarga automática. Más información aquí.config.eager_load = true
en todos los entornos para ver los problemas de carga de código con entusiasmo en el desarrollador.Rails.application.eager_load!
antes de jugar con hilos para evitar errores de "dependencia circular".Si tiene extensiones de ruby / rails, deje ese código dentro del
lib
directorio anterior y cárguelos manualmente desde el inicializador. Esto asegurará que las extensiones se carguen antes de su lógica adicional que puede depender de ello:fuente
lib
carpeta ahora? Quiero decir, mover ellib
directorio alapp
directorio parece una solución alternativa./app/lib/
coloca un archivo / clase y NO se carga automáticamente. probado en rails 5.1, nuevo proyectoRails.application.eager_load!
lib
tienen una cercanía percibida diferente al proyecto que las cosas en elapp
directorio. Varias de las otras respuestas son mejores que esta.Acabo de usar en
config.eager_load_paths
lugar deconfig.autoload_paths
mencionar akostadinov en el comentario de github: https://github.com/rails/rails/issues/13142#issuecomment-275492070Funciona en entornos de desarrollo y producción.
Gracias Johan para la sugerencia de reemplazar
#{Rails.root}/lib
conRails.root.join('lib')
!fuente
config.eager_load_paths << Rails.root.join('lib')
.config.eager_load_paths += [Rails.root.join('lib')]
lugar porqueconfig.eager_load_paths
es una matriz congeladaapplication.rb
, funcionará utilizando ambos métodos.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
lib
carpeta en miapp
directorio como se recomienda en Github .app
Rails carga automáticamente cada carpeta de la carpeta.fuente
config.eager_load_paths << "#{Rails.root}/lib"
, eso es mejor IMO para seguir la estructura recomendada de la aplicación rails.app/lib
miembros de rails recomiendan poner lib en github.com/rails/rails/issues/13142#issuecomment-275549669lib
. Esperaría a que entrara tiernamente o DHH. Mientras tanto, (personalmente) recomendaría seguir con la respuesta de @Lev Lukomsky./lib
directorio en absoluto. La mayoría de las veces, las bibliotecas de terceros son gemas y, si no, debería crearse una gema. Para otros archivos, creo carpetas específicas en el/app
directorio. Por ejemplovalidators
.Aquí hay una larga discusión sobre este tema. https://github.com/rails/rails/issues/13142
fuente
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)
fuente
Simplemente cambie config.autoload_paths a config.eager_load_paths en el archivo config / application.rb. Porque en rails 5 la carga automática está desactivada para el entorno de producción de forma predeterminada. Para más detalles por favor siga el enlace .
Funciona tanto para el desarrollo del medio ambiente como para la producción.
fuente
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:
fuente
Para cualquiera que haya tenido problemas con esto como yo, no es suficiente colocar un directorio debajo
app/
. Sí, obtendrá la carga automática pero no la recarga necesaria , lo que requiere que se cumplan las convenciones de espacio de nombres .Además, el uso del inicializador para cargar el nivel raíz anterior
lib
evitará la función de recarga durante el desarrollo.fuente
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
fuente
para resumir la respuesta de Lev:
mv lib app
fue suficiente paralib
cargar y cargar automáticamente todo mi código.(Rails 6.0.0beta3 pero también debería funcionar bien en rails 5.x)
fuente