2010-06-19 16 views
5

İç kullanım için bir taş yapıyorum. İçinde başka bir dizinden bazı YAML yüklemek: Doğrusu initializer.rb için data/root.yaml göreli konumuna bağlı olmayan ediyorumRuby'deki belirli bir göreli yoldan dosyaları nasıl yüklerim?

# in <project_root>/bin/magicwand 
MagicWand::Configuration::Initializer.new(...) 

# in <project_root>/lib/magicwand/configuration/initializer.rb 
root_yaml = YAML.load_file(
    File.expand_path("../../../../data/#{RootFileName}", __FILE__)) 

# in <project_root>/data/root.yaml 
--- 
apple: 100 
banana: 200 
coconut: 300 

. Bunun yerine, <project_root>'a bir referans almayı tercih ediyorum ve oradaki göreli yola bağlıyım, bu da daha akıllı bir hareket gibi görünüyor.

İlk olarak, bunun için en iyi yol bu mu? İkincisi, eğer öyleyse, bunu nasıl yaparım? Çeşitli File yöntemlerini inceledim, ancak böyle bir şey olduğunu düşünmüyorum. Ruby 1.9 kullanıyorum.

Şu anda, özel sabit oluşturmak ve bunun yerine bağlıdır:

# in lib/magicwand/magicwand.rb 
module MagicWand 
    # Project root directory. 
    ROOT = File.expand_path("../..", __FILE__) 
end 

ama ben de bu yaklaşımı gibi emin değilim.

cevap

4

Her zaman çalıştırdığınız bir ana dosya varsa, bu dosyayı referans noktası olarak kullanabilirsiniz. o dosyanın (geçerli dizin ve arasında) göreli yolu böylece bir var Yani

path_to_root_yaml = File.dirname($0) + '/data/root.yaml' 
+0

yapmak (yani ana dosya ve root.yaml arasındaki göreli yolu olduğunu varsayarak) data/root.yaml göreli yolunu almak için, $0 olacak İyi bir fikir, ancak testler sırasında, tam uygulama yığınını ateşlemek yerine, sınıfları doğrudan test ettiğimde kırılırdı. $ 0'm bu gibi durumlarda farklı olurdu (test yürütücüsüne giden yol, uygulamam değil). –

+0

Aramayı, sınama sırasında ekleyebileceğiniz basit bir nesneye sarın. – Theo

İlgili konular