Saya telah memperbarui salah satu aplikasi saya dari Rails 4.2.6 ke Rails 5.0.0. The Peningkatan Panduan mengatakan, bahwa fitur autoload sekarang dinonaktifkan dalam produksi secara default.
Sekarang saya selalu mendapatkan kesalahan pada server produksi saya karena saya memuat semua file lib dengan autoload dalam application.rb
file.
module MyApp
class Application < Rails::Application
config.autoload_paths += %W( lib/ )
end
end
Untuk saat ini, saya telah mengatur config.enable_dependency_loading
untuk true
tetapi saya ingin tahu apakah ada solusi yang lebih baik untuk ini. Pasti ada alasan bahwa Autoloading dinonaktifkan dalam produksi secara default.
lib
dir, satu file mudah tersedia di Runtime, tetapi yang lain harus diperlukan secara manual: DValidators
) di folder langsung di app / direktori karena kode ada yang dimuat secara otomatis.app/services/paylinx/paylinx_service.rb
definisi Kelas:module Paylinx class PaylinxService end end
. Saya mencobaautoload_paths
hal - hal ini . tidak bekerja untuk saya.Jawaban:
Daftar perubahan saya setelah pindah ke Rails 5:
lib
dir keapp
karena semua kode di dalam aplikasi dimuat secara otomatis di dev dan bersemangat dimuat di prod dan yang paling penting adalah memuat otomatis dalam pengembangan sehingga Anda tidak perlu me-restart server setiap kali Anda membuat perubahan.require
pernyataan yang menunjuk ke kelas Anda sendiri di dalamlib
karena mereka semua tetap dimuat secara otomatis jika penamaan file / dir mereka benar, dan jika Anda meninggalkanrequire
pernyataan itu dapat merusak autoreloading. Info lebih lanjut di siniconfig.eager_load = true
di semua lingkungan untuk melihat masalah pemuatan kode dengan penuh semangat di dev.Rails.application.eager_load!
sebelum bermain dengan utas untuk menghindari kesalahan "ketergantungan sirkular".Jika Anda memiliki ekstensi ruby / rails maka biarkan kode itu di dalam
lib
direktori lama dan muat secara manual dari initializer. Ini akan memastikan bahwa ekstensi dimuat sebelum logika Anda selanjutnya yang dapat bergantung padanya:sumber
lib
folder sekarang? Maksud saya pindahlib
dir keapp
dir sepertinya semacam solusi./app/lib/
menempatkan file / kelas dan itu TIDAK autoloading. diuji di rel 5.1, proyek baruRails.application.eager_load!
lib
memiliki kedekatan yang dirasakan berbeda dengan proyek dari hal-hal dalamapp
direktori. Beberapa jawaban lain lebih baik daripada yang ini.Saya hanya menggunakan
config.eager_load_paths
alih-alihconfig.autoload_paths
seperti menyebutkan akostadinov di github komentar: https://github.com/rails/rails/issues/13142#issuecomment-275492070Ini bekerja pada pengembangan dan lingkungan produksi.
Terima kasih Johan untuk saran untuk mengganti
#{Rails.root}/lib
denganRails.root.join('lib')
!sumber
config.eager_load_paths << Rails.root.join('lib')
.config.eager_load_paths += [Rails.root.join('lib')]
karenaconfig.eager_load_paths
array bekuapplication.rb
dalamnya akan bekerja menggunakan kedua metode.Autoloading dinonaktifkan di lingkungan produksi karena keselamatan ulir. Terima kasih kepada @ Зелёный untuk tautannya.
Saya memecahkan masalah ini dengan menyimpan file lib di
lib
folder diapp
direktori saya seperti yang direkomendasikan di Github . Setiap folder dalamapp
folder akan dimuat oleh Rails secara otomatis.sumber
config.eager_load_paths << "#{Rails.root}/lib"
, itu IMO yang lebih baik untuk mengikuti struktur aplikasi rel yang direkomendasikan.app/lib
direkomendasikan oleh anggota rel github.com/rails/rails/issues/13142#issuecomment-275549669lib
. Saya akan menunggu tenderlove atau DHH untuk berpadu. Sementara itu, saya (secara pribadi) akan merekomendasikan tetap dengan jawaban @Lev Lukomsky./lib
direktori sama sekali. Lib pihak ketiga adalah sebagian besar permata waktu dan jika tidak harus ada permata yang dibuat. Untuk file lain, saya membuat folder spesifik di/app
direktori. Sebagai contohvalidators
.Berikut ini diskusi panjang tentang masalah ini. https://github.com/rails/rails/issues/13142
sumber
Ini memungkinkan untuk memuat otomatis lib, dan bekerja di lingkungan produksi juga.
NB Saya telah mengubah jawaban saya, sekarang ini menambah kedua jalur pengisian otomatis, terlepas dari lingkungan, untuk memungkinkan pekerjaan di lingkungan kustom juga (seperti panggung)
sumber
Ubah saja config.autoload_paths ke config.eager_load_paths dalam file config / application.rb. Karena pada rel 5 autoloading dinonaktifkan untuk lingkungan produksi secara default. Untuk lebih jelasnya silakan ikuti tautan .
Ini berfungsi baik untuk pengembangan lingkungan dan produksi.
sumber
Dalam beberapa hal, berikut ini adalah pendekatan terpadu dalam Rails 5 untuk memusatkan konfigurasi eager dan autoload, sekaligus menambah jalur autoload yang diperlukan setiap kali eager load dikonfigurasi jika tidak maka tidak akan dapat bekerja dengan benar:
sumber
Bagi siapa pun yang berjuang dengan ini seperti saya, tidak cukup hanya dengan menempatkan direktori di bawah
app/
. Ya, Anda akan mendapatkan autoloading tetapi tidak perlu memuat ulang, yang mengharuskan konvensi penempatan nama harus dipenuhi .Juga, menggunakan penginisialisasi untuk memuat level root yang lama
lib
akan mencegah fitur reload selama pengembangan.sumber
Memindahkan folder lib ke aplikasi membantu menyelesaikan masalah, api Twitter saya tidak akan berjalan dalam produksi. Saya memiliki "TwitterApi konstan tidak diinisialisasi" dan API Twitter saya ada di folder lib saya. Saya punya
config.autoload_paths += Dir["#{Rails.root}/app/lib"]
di application.rb saya tetapi tidak berhasil sebelum memindahkan folder.Ini berhasil
sumber
untuk meringkas jawaban Lev:
mv lib app
sudah cukup untuk memiliki semua milikkulib
kode autoloaded / auto-reloaded.(rel 6.0.0beta3 tetapi harus bekerja dengan baik pada rel 5.x juga)
sumber