2011-12-13 14 views
9

Rails 3.0.x uygulamasına sahibim. Gemfile kullanmadan, çalışma zamanında taşlar yüklemek istiyorum. Ben başarmak istiyorum neRaylar çalışma zamanında raylara yükleniyor 3

düzenli taşlar Bundler tarafından yüklenen ile, her zamanki gibi başvurumu yüklemektir. Bundan sonra belirli bir dizinde bulunan tüm taşları (Rails Engines) yüklemek istiyorum (ancak çalışma zamanına kadar, hangi taşların olacağını bilmiyorum). Bu belki Bundler API kullanarak, Rails mümkün olup olmadığını

bilen var mı?

+0

yorumlar: Eğer kullanım senaryosunu açıklayabilir? Bunu neden yapmak isteyeceğiniz bana açık değil. – nathanvda

+0

Fikir, modülleri çalışma süresinde yükleyecek modüler Raylar uygulamasına sahip olmaktı. Ben, dizine modülleri/mücevher koymak uygulamayı başlatmak ve ben bazı seçenekler (ücretli/lisans) dayalı olarak istemci-sitesinde yüklemek bazı jenerik raylar uygulaması var varsayarak ve am –

+0

Tamam :) esnek olmak istedim, yüklemek klasördeki doğru modüller. Peki ya sadece Gemfile dosyasını düzenlerseniz ve kurulumları paketlerseniz? Daha az iş, daha güvenli ve tek düzenleme/konfigürasyon Gemfile'ı düzenliyordu. Bizim yaptığımız şey bu. Kendi "özel" mücevherlerimiz için kendi mücevhercimizi barındırıyoruz. Bir modül etkinleştirilir veya devre dışı bırakılırsa, sadece Gemfile, demet ve yeniden başlatırız. – nathanvda

cevap

6

tehlikelidir. senin Raylar Motorların her biri de taşlar ise - o zaman onlar da diğer bağımlılıklar ile Gemfiles olurdu ve siz Bundler, o zaman zamanında daha az problem olurdu olanlar çözmek için izin verirsek bu sırayla, vb diğer bağımlılıklar olurdu. İşte

herhangi kesmek olmadan bunu yapacağını nasıl. Gemfile'unuzun sadece Ruby kodu olduğunu ve varsayılan olarak yüklenmemiş olan mücevherleriniz olduğunu unutmayın.

# In your Gemfile, add at the end: 
Dir[YOUR_RAILS_ENGINES_SUBFOLDER + "/*/*.gemspec"].each do |gemspec_file| 
    dir_name = File.dirname(gemspec_file) 
    gem_name = File.basename(gemspec_file, File.extname(gemspec_file)) 

    # sometimes "-" and "_" are used interchangeably in gems 
    # for e.g. gemspec_file is "engines/my-engine/my_engine.gemspec" 
    # dir_name will be engines/my-engine 
    # gem_name will be my_engine 

    # Register that engine as a dependency, *without* being required 
    gem gem_name, :path => dir_name, :require => false 

    # e.g. this is similar to saying 
    # gem 'my_engine', :path => 'engines/my-engine', :require => false 
end 

Artık tüm dinamik Rails motorlarınız mücevher bağımlılıkları olarak kayıtlı. Bundler onları ve alt bağımlılıklarını çözecek, böylece hiçbir şey için endişelenmenize gerek kalmayacak. Uygulamayı çalıştırmadan önce veya bu klasördeki herhangi bir motoru eklediğinizde/kaldırdığınızda bir kez bundle install çalıştırın.

İyi olan şey, bu mücevherler sadece kayıtlı olacak ve yüklenmeyecek. Yani üretim kodunda, artık sadece require <your-engine-name>

Edit diyerek çalışma zamanında seçim ne olursa olsun taş yükleyebilirsiniz: Ekstra kod meraktan

+1

Güzel, 1.5 yıl önce bu soruyu sordum ve artık Rails kullanmıyorum, ama bence bu aradığım şeydi ve aslında işe yarayabilirdi. Teşekkürler –

+1

OP değilim, ama bu soru için ödül başlamıştım. Sorulan soru, başlangıçta motorların çalışma zamanında dinamik olarak nasıl yükleneceğiydi. Başlangıçta yükleme yeterliyse, Bundler.load_gemspec'i boot.rb.'den çağırmak daha basit bir yaklaşım olacaktır. –

+0

Bu kod, taşlar * dinamik olarak yüklenmekten çok uzaktadır *. – Nowaker

0

bu deneyin:

yapmanız için çalışıyoruz ne
Bundler.with_clean_env do 
    # require gems... 
end 
+0

ben bir şey eksik ve önce bilmiyorum denedim ama bu çizgiyi eklerseniz 'boot.rb' ben hatayı almaya:' 'my_gem' grubunun parçası değildir. Gemfile ekleyin. ' –

+0

Ne yazıyor:' # taşlar gerektirir ... ', belki de eksik olduğum şey nedir? –

İlgili konular