Ruby'deki bir dizindeki tüm dosyaları istemenin en iyi yolu nedir?
Ruby'deki bir dizindeki tüm dosyaları istemenin en iyi yolu nedir?
Yanıtlar:
Nasıl olur:
Dir["/path/to/directory/*.rb"].each {|file| require file }
require
, .rb
uzantının varlığı veya yokluğu ile karıştırılmıyor . MRI 1.8.7-p374 üzerinde test edildi, 2.1.5 ve 2.2.0 test edildi. Bu kentsel efsane, "akıllı" otomatik yüklemenin eski sürümlerde tanımladığı davranışı sergilediği (ve yine de sergileyebileceği) Rails'ten geliyor.
Gerekli olan dosyaya göre bir dizinse (örn. Lib dizinindeki tüm dosyaları yüklemek istiyorsunuz):
Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }
Düzenleme: Aşağıdaki yorumlara dayanarak güncellenmiş bir sürüm:
Dir[File.join(__dir__, 'lib', '*.rb')].each { |file| require file }
Dir[File.dirname(__FILE__) + '/support/**/*.rb'].each {|file| require file }
Dir[File.join(File.dirname(__FILE__), 'lib', '*.rb')].each {|file| require file }
__dir__
yerine = kullanabilirsiniz File.dirname(__FILE__)
.
require_relative
Bir dizindeki tüm dosyaları istemek için nasıl kullanılır ?
Requir_all gem deneyin:
Basitçe:
require_all 'path/to/directory'
require_all
döngüsel bağımlılık çözümünün kaynak kodunuzdaki bir sorun etrafında çalıştığını unutmayın: bağımlılıklarını gerektirmeyen Ruby kaynak dosyalarınız var. Bu, kapıyı neşter yüklemesine kapatır ve sizi ya hep ya hiç yüklemeye adar. Bu küçük kütüphanelerde bir sorun değil, ama bilinçli olarak vermeniz gereken bir karar.
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file|
require File.basename(file, File.extname(file))
end
Uzantıyı kaldırmazsanız, aynı dosyayı iki kez isteyebilirsiniz (ruby, "foo" ve "foo.rb" öğelerinin aynı dosya olduğunu fark etmez). Aynı dosyaya iki kez ihtiyaç duyulması sahte uyarılara neden olabilir (örn. "Uyarı: zaten başlatılmış sabit").
require "foo.rb"; require "foo";
yüklenecek foo.rb
.
require
varlığı veya yokluğu ile karıştırılmaması .rb
. MRI 1.8.7-p374, 2.1.5 ve 2.2.0 üzerinde test edilmiştir. Bu kentsel efsane, "akıllı" otomatik yüklemenin eski sürümlerde açıklanan davranışı sergilediği (ve yine de sergileyebileceği) Rails'ten geliyor.
Dir.glob(File.join('path', '**', '*.rb'), &method(:require))
veya alternatif olarak, dosyaları belirli klasörlere yüklenecek şekilde kapsamlandırmak istiyorsanız:
Dir.glob(File.join('path', '{folder1,folder2}', '**', '*.rb'), &method(:require))
açıklama:
Dir.glob bir bloğu argüman olarak alır.
method (: requir) , method yöntemini döndürür.
& method (: requir) yöntemi bir bloğa dönüştürür.
Dir.glob( File.join( File.dirname(__FILE__), '{lib,addons}', 'subfolder', '**', '*.rb' ), &method(:require) )
platforma olan bağımlılığı ortadan kaldırır ('/' veya '\' gibi). İyi çalışıyor. Teşekkürler.
En iyi yol, dizini yükleme yoluna ve ardından require
her dosyanın taban adına eklemektir . Bunun nedeni, yanlışlıkla aynı dosyayı iki kez istemekten kaçınmak istemenizdir - genellikle amaçlanan davranış değildir. Bir dosyanın yüklenip yüklenmeyeceği, dosyaya daha require
önce aktarılan yolu görüp görmediğine bağlıdır . Örneğin, bu basit irb oturumu yanlışlıkla aynı dosyayı iki kez gerektirip yükleyebileceğinizi gösterir.
$ irb
irb(main):001:0> require 'test'
=> true
irb(main):002:0> require './test'
=> true
irb(main):003:0> require './test.rb'
=> false
irb(main):004:0> require 'test'
=> false
İlk iki satırın true
aynı dosyanın her iki kez yüklendiği anlamına geldiğini unutmayın. Yollar kullanıldığında, yollar aynı konuma işaret etse bile require
, dosyanın zaten gerekli olduğunu bilmez.
Bunun yerine, yükleme yoluna bir dizin ekliyoruz ve daha sonra içindeki her * .rb dosyasının taban adını gerektiriyoruz.
dir = "/path/to/directory"
$LOAD_PATH.unshift(dir)
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }
Dosyanın bir kereden fazla gerekli olmasını umursamıyorsanız veya amacınız yalnızca dosyanın içeriğini yüklemekse, load
bunun yerine belki de kullanılmalıdır require
. Bu durumda yük kullanın, çünkü ne yapmaya çalıştığınızı daha iyi ifade eder. Örneğin:
Dir["/path/to/directory/*.rb"].each {|file| load file }
Bazı yanıtlardaki gibi yolları birleştirmek yerine şunu kullanıyorum File.expand_path
:
Dir[File.expand_path('importers/*.rb', File.dirname(__FILE__))].each do |file|
require file
end
Güncelleme:
Kullanmak yerine File.dirname
aşağıdakileri yapabilirsiniz:
Dir[File.expand_path('../importers/*.rb', __FILE__)].each do |file|
require file
end
Nerede ..
dosya adını şeritler __FILE__
.
File.expand_path
Rails.root.join
Raylardaysanız çeşitli cevaplar da işe yarar.
Rails'te şunları yapabilirsiniz:
Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
Güncelleme: Eğik çizgileri kaldırmak için @Jiggneshh Gohel önerisiyle düzeltildi.
Rails.root.join('/lib')
doğru yol oluşturmaz. Bunu doğru çalışması için buldum:Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
Peki ya: require_relative *Dir['relative path']
?
require_relative *Dir['*.rb']
sadece bir ruby-script varsa çalışın. Birden yakut komut bulunursa Ama eğer olsunrequire_relative': wrong number of arguments (4 for 1) (ArgumentError)