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:
-
Coloque
lib
dir en laapp
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. -
Elimine cualquier declaración
require
que apunte a sus propias clases dentro delib
porque todas se cargan automáticamente de todos modos si sus nombres de archivo / directorio son correctos, y si deja las declaracionesrequire
, puede interrumpir la recarga automática. Más información here -
Establezca
config.eager_load = true
en todos los entornos para ver los problemas de carga de código con entusiasmo en dev. -
Utilice
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 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 cualquiera que haya tenido problemas con esto como yo, no es suficiente colocar un directorio debajo de
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 la antigua biblioteca de nivel raíz evitará la función de recarga durante el desarrollo.
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)