2008-09-19 5 views
24

Je dois stocker quelques propriétés simples dans un fichier et y accéder à partir de Ruby. J'adore le format de fichier .properties qui est la norme pour de telles choses en Java (en utilisant la classe java.util.Properties) ... c'est simple, facile à utiliser et facile à lire. Donc, y a-t-il quelque part une classe Ruby qui me permettra de charger des paires de valeurs clés à partir d'un fichier comme ça sans trop d'efforts? Je ne veux pas utiliser le format XML, donc ne suggérez pas de REXML (mon but ne justifie pas la "taxe d'angle").Java fichier .properties équivalent pour Ruby?

J'ai envisagé de rouler ma propre solution ... ce serait probablement environ 5-10 lignes de code, mais je préférerais utiliser une bibliothèque existante (si c'est essentiellement un hash construit à partir d'un fichier). . comme cela le ramener à 1 ligne ....


MISE à JOUR: il est en fait une application Ruby droit, pas des rails, mais je pense que YAML fera bien (il était à l'arrière de mon esprit, mais je l'avais oublié ... vu mais jamais utilisé pour le moment), merci à tous!

Répondre

26

Est-ce que c'est pour une application Rails ou une application Ruby? Vraiment avec soit vous pouvez être en mesure de coller vos propriétés dans un fichier yaml et puis YAML::Load(File.open("file")).


NOTE de Mike Stone: Il serait en fait de mieux à faire:

File.open("file") { |yf| YAML::load(yf) } 

ou

YAML.load_file("file") 

les docs rubis suggèrent, sinon le fichier ne sera pas fermé jusqu'à la collecte des ordures, mais bonne suggestion malgré :-)

+0

J'ai édité en ligne que les commentaires ne seraient probablement pas remarqué ... –

+0

Oui, c'est un problème avec SO les commentaires semblent si ... invisibles. Je n'ai pas pensé à le faire dans un bloc, génial! –

2

du style .properties du fichier de configuration, vous pouvez envisager d'utiliser YAML. YAML utilisé dans Ruby on Rails pour la configuration de base de données, et a gagné en popularité dans d'autres langages (Python, Java, Perl, et autres).

Un aperçu du module Ruby YAML est ici: http://www.ruby-doc.org/core/classes/YAML.html

Et la page d'accueil de YAML est ici: http://yaml.org

3

Devender Gollapally a écrit un class à faire précisément:

... Bien que je recommanderais mieux d'utiliser un fichier YAML.

6

YAML le fera parfaitement comme décrit ci-dessus. Pour un exemple, dans un de mes scripts Ruby j'ai un fichier YAML comme:

migration: 
    customer: Example Customer 
    test:  false 
sources: 
- name:  Use the Source 
    engine: Foo 
- name:  Sourcey 
    engine: Bar 

que je l'utilise ensuite dans les Ruby comme:

config = YAML.load_file(File.join(File.dirname(__FILE__), ARGV[0])) 
puts config['migration']['customer'] 

config['sources'].each do |source| 
    puts source['name'] 
end 
9

Une autre option est d'utiliser simplement un autre fichier Ruby comme fichier de configuration.

exemple, créez un fichier appelé 'options'

{ 
    :blah => 'blee', 
    :foo => 'bar', 
    :items => ['item1', 'item2'], 
    :stuff => true 
} 

Et puis dans votre code Ruby faire quelque chose comme:

ops = eval(File.open('options') {|f| f.read }) 
puts ops[:foo] 
+2

cette option n'offre-t-elle pas un potentiel d'abus? eval exécutera n'importe quel code Ruby arbitraire de sorte que, par exemple, des choses désagréables pourraient être faites au système de fichiers. – Straff

+2

Abus si vous évaluez du code à partir d'une source non fiable telle qu'un formulaire Web, cette réponse est pour une question concernant la lecture d'un fichier d'options. Si quelqu'un voulait bricoler cela, ils seraient également en mesure de bricoler le code ruby ​​en le lisant ... –

+0

+1: J'aime votre pensée originale. –

3

inifile-http://rubydoc.info/gems/inifile/2.0.2/frames soutiendra les fichiers .properties de base et aussi Fichiers .ini avec [SECTIONS] par ex.

[SECTION] 
key=value 

YAML est bon lorsque vos données a une structure complexe, mais peut être fiddly avec des espaces, des onglets, la fin des lignes, etc. - qui pourraient causer des problèmes si les fichiers ne sont pas gérés par les programmeurs. En revanche, les fichiers .properties et .ini sont plus tolérants et peuvent convenir si vous n'avez pas besoin de la structure profonde disponible via YAML.