Soru Raylar 5: Üretimde lib dosyaları yükleyin


Uygulamalarımdan birini Rails 4.2.6'dan Rails 5.0.0'a yükselttim. Yükseltme Rehberi diyor ki, otomatik yükleme özelliği artık üretimde varsayılan olarak devre dışı bırakıldı.

Artık tüm lib dosyalarını otomatik yük ile yüklediğimden, üretim sunucumda her zaman bir hata alıyorum. application.rb dosya.

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

Şimdilik config.enable_dependency_loading için true ama bunun için daha iyi bir çözüm olup olmadığını merak ediyorum. Otomatik yüklemenin varsayılan olarak üretimde devre dışı bırakılmasının bir nedeni olmalıdır.


76
2017-07-05 08:30


Menşei


Bunu hiç anladın mı? - dkam
çılgın şey ve dokümanlar hala auto_load yapmanı söylüyor. Yeni bir uygulama için üretimde neyin yanlış gittiğini çok kafam karıştı. Ve Rails 5 ile çalışmaya başladığımdan beri göçmen kılavuzunu okumadım. Bunu çözüme kavuşturmak için bir dokümana başvurdum: github.com/rails/rails/issues/27268 - akostadinov
inanılmaz, iki dosyam var lib dir, bir dosya Çalışma Zamanı içinde kolayca kullanılabilir, ancak başka bir şey manuel olarak istenmelidir: D - illusionist
@Tobias Sonunda hangi çözümle başardınız? - geoboy
@geoboy I grup kodu (gibi Validatorskod otomatik olarak yüklendiğinden, doğrudan uygulama / dizin içindeki klasörlerde. - Tobias


Cevaplar:


Rails 5'e geçtikten sonra yaptığım değişiklikler listesi:

  1. yer lib dir app çünkü uygulama içindeki tüm kodlar otomatik yüklenmesi dev ve istekli yüklendi eşya üretiminde ve en önemlisi autoreloaded geliştirmede, her değişiklik yaptığınızda sunucuyu yeniden başlatmanız gerekmez.
  2. Herhangi birini kaldır require içindeki kendi sınıflarına işaret eden ifadeler lib çünkü dosya / dir isimleri doğruysa ve eğer bırakırsanız hepsi otomatik olarak yüklenir require İfadeleri otomatik olarak kesebilir. Daha fazla bilgi İşte
  3. Set config.eager_load = true Tüm ortamlarda kod yükleme problemlerini devasa bir şekilde görmeye çalışıyor.
  4. kullanım Rails.application.eager_load! "dairesel bağımlılık" hatalarından kaçınmak için iş parçacığı ile oynamadan önce.
  5. Herhangi bir yakut / ray uzantısı varsa, o kodu eski içinde bırakın lib dizin ve bunları başlatıcıdan el ile yükleyin. Bu, uzantıların ona bağlı olabilecek diğer mantığınızdan önce yüklenmesini sağlayacaktır:

    # 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 }
    

105
2017-10-13 10:58



Peki biri nasıl kullanıyor? lib şimdi klasör mü? Hareket etmeyi kastediyorum lib dir app Dir bir tür geçici çözüm gibi görünüyor. - Martin Svoboda
/app/lib/bir dosya / sınıf yerleştirdi ve bu otomatik yükleme DEĞİLDİR. raylarda test 5.1, yeni proje - huan son
Baharı durdurmanız gerektiğini belirten bir şey. Her şeyi app / lib / programına taşıdım ve biraz zaman harcadım, neden hala derslerimi konsoldan kullanamadığımı merak ediyorum. bahar dur ftw :) - jacklin
Aşağıdaki satır nereye giderdi Rails.application.eager_load! - Steven Aguilar
@Lev: Bunu yaptığımda, aşağıdaki hatayı görüyorum dev: NameError - uninitialized constant ApplicationController::JsonWebToken: Neler olabileceğini biliyor musun? - geoboy


Az önce kullandım config.eager_load_paths yerine config.autoload_paths Github yorumunda akostadinov'dan bahsetmek gibi: https://github.com/rails/rails/issues/13142#issuecomment-275492070

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

Geliştirme ve üretim ortamı üzerinde çalışır.

Teşekkürler Johan değiştirilmesi önerisi için #{Rails.root}/lib ile Rails.root.join('lib')!


33
2017-07-08 11:32



ÇALIŞIYOR bir cazibe gibi. Sözdizimini sevmedim, öyle değişti config.eager_load_paths << Rails.root.join('lib'). - Johan Wentholt


İplik güvenliği nedeniyle üretim ortamında otomatik yükleme devre dışıdır. Bağlantı için @ Зелёный için teşekkür ederiz.

Lib dosyalarını bir dosyada saklayarak bu sorunu çözdüm. lib klasörümde app dizin olarak önerilen Github. İçindeki her klasör app klasör otomatik olarak Rails tarafından yüklenir.


24
2017-08-18 17:34



Github'da uzun tartışma dizisini incelemek istemiyorsanız, burada distile açıklama bulabilirsiniz: collectiveidea.com/blog/archives/2016/07/22/... - Ernest
kullandım config.eager_load_paths << "#{Rails.root}/lib"önerilen raylar uygulama yapısını takip etmek daha iyi IMO. - akostadinov
Lib yerleştirme app/lib ray üyeleri tarafından tavsiye edilir github.com/rails/rails/issues/13142#issuecomment-275549669 - eXa
Bu tamamen amacını mahveder lib olduğunu. Ben de merhabe ya da DHH'nin içeri girmesini beklerdim. Bu arada, ben (kişisel olarak) Lev Lukomsky'nin cevabıyla yapışmayı öneriyorum. - Josh Brody
@JoshBrody Benim düşüncem şu an /lib hiç dizin. Üçüncü parti lib'leri çoğu zaman değerlidir ve eğer yaratılmamış bir mücevher olmalıdır. Diğer dosyalar için özel klasörler oluşturuyorum. /app dizin. Örneğin validators. - Tobias


Autoloading'in üretimde devre dışı bırakılmasının bir nedeni olmalı.   varsayılan.

İşte bu konu hakkında uzun bir tartışma var. https://github.com/rails/rails/issues/13142


17
2017-07-05 08:43





Bu lib autoreload sahip olmasını sağlar ve üretim ortamında da çalışır.

Not; Cevabımı değiştirdim, şimdi de, ortamdan bağımsız olarak, özel ortamlarda da (sahne gibi) çalışmaya izin vermek için, hem otomatik yük yolları hem de hevesle katkıda bulunuyor.

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

5
2018-01-29 13:50



Bu sorunun neden giderildiğini genişletebilir misiniz? - Stuart.Sklinar
@ Stuart.Sklinar bu lib autoreload sahip olmasını sağlar ve üretim ortamında da çalışır. Not; Cevabımı değiştirdim, şimdi de, ortamdan bağımsız olarak, özel ortamlarda da (sahne gibi) çalışmaya izin vermek için, hem otomatik yük yolları hem de hevesle katkıda bulunuyor. - srghma
Genişletebilir misin (cevabın içinde)? Sadece kodun cevabı, kimsenin neden bu şekilde yapılması gerektiğini anlamasına yardım etmiyor - Ben bir Ruby dev değilim, sadece SO'yı temizlemeye yardım etmeliyim. Bir "kod sadece cevabı" için bazı yorum eklemek bazı gerçek bağlamı verirdi. - Stuart.Sklinar
@ Stuart.Sklinar emin - srghma


Bunun gibi benimle uğraşan herkes için, sadece bir dizinin altına yerleştirmek yeterli değil app/. Evet, otomatik yükleme olacak ama gerekli değil yeniden adlandırma, adlandırma kurallarının yerine getirilmesini gerektirir.

Ayrıca, eski kök düzeyini yüklemek için başlatıcıyı kullanma lib Geliştirme sırasında yeniden yükleme özelliğini engeller.


2
2018-05-10 23:53





Bir anlamda, Rails 5'in istekli ve otomatik yük konfigürasyonunu merkezileştirmek için birleşik bir yaklaşımdır, aynı zamanda istekli yük yapılandırıldığında gerekli olan otomatik yük yolunu ekler, aksi takdirde doğru şekilde çalışamaz:

# 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
...

1
2018-05-29 16:29





Lib klasörünü uygulamaya taşıyarak bir sorunu çözmeye yardımcı oldu, Twitter api üretimde çalışmayacaktı. "Unutitialized constant TwitterApi" vardı ve Twitter API'm lib klasöründeydi. sahiptim config.autoload_paths += Dir["#{Rails.root}/app/lib"] benim application.rb içinde ama klasör taşımadan önce çalışmadı.

Bu hile yaptı


0
2017-11-15 23:54