Эквивалент файла Java .properties для Ruby?

Мне нужно сохранить несколько простых свойств в файле и получить к ним доступ из Ruby.

Мне очень нравится формат файла .properties, который является стандартом для таких вещей в Java (с использованием класса java.util.Properties) ... он прост, удобен в использовании и легко читается.

Итак, есть ли где-нибудь класс Ruby, который позволит мне без особых усилий загрузить несколько пар ключ-значение из такого файла?

Я не хочу использовать XML, поэтому, пожалуйста, не предлагайте REXML (моя цель не гарантирует «налога на угловые скобки»).

Я подумал о том, чтобы развернуть свое собственное решение ... вероятно, это будет около 5-10 строк кода, но я все равно предпочел бы использовать существующую библиотеку (если это по сути хеш, созданный из файла) ... как это было бы довести до 1 строчки ....


ОБНОВЛЕНИЕ: на самом деле это обычное приложение Ruby, а не рельсы, но я думаю, что YAML подойдет (это было в глубине души, но я забыл об этом ... видел, но пока не использовал), спасибо всем !


person Mike Stone    schedule 19.09.2008    source источник


Ответы (6)


Это для Rails-приложения или для Ruby?

На самом деле, с любым из них вы можете вставить свои свойства в файл yaml, а затем YAML::Load(File.open("file")) его.


ПРИМЕЧАНИЕ Майка Стоуна: на самом деле было бы лучше сделать:

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

or

YAML.load_file("file")

как предлагают рубиновые документы, иначе файл не будет закрыт до сборки мусора, но хорошее предложение, несмотря ни на что :-)

person Ryan Bigg    schedule 19.09.2008
comment
Да, это проблема, ТАК комментарии кажутся такими ... невидимыми. Я не думал о том, чтобы делать это блоком, великолепно! - person Ryan Bigg; 19.09.2008

Другой вариант - просто использовать другой файл Ruby в качестве файла конфигурации.

Например, создайте файл с именем 'options'

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

А затем в вашем коде Ruby сделайте что-нибудь вроде:

ops = eval(File.open('options') {|f| f.read })
puts ops[:foo]
person Aaron Hinni    schedule 19.09.2008
comment
этот вариант не дает возможности для злоупотреблений? eval выполнит любой произвольный код Ruby, так что, например, с файловой системой могут быть сделаны неприятные вещи. - person Straff; 20.07.2010
comment
Злоупотребление, если вы извлекаете код из ненадежного источника, такого как веб-форма, этот ответ относится к вопросу о чтении файла параметров. Если кто-то захочет повозиться с этим, он также сможет повозиться с кодом Ruby, читая его ... - person Aaron Hinni; 20.07.2010

YAML отлично справится с этим, как описано выше. Например, в одном из моих сценариев Ruby у меня есть файл YAML, например:

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

который я затем использую в Ruby как:

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

config['sources'].each do |source|
  puts source['name']
end
person Dan Harper    schedule 19.09.2008

inifile - http://rubydoc.info/gems/inifile/2.0.2/frames будет поддерживать базовые файлы .properties, а также файлы .ini с [РАЗДЕЛЫ], например.

[SECTION]
key=value

YAML хорош, когда ваши данные имеют сложную структуру, но могут быть неудобными с пробелами, табуляциями, концом строк и т. Д., Что может вызвать проблемы, если файлы не поддерживаются программистами. Напротив, файлы .properties и .ini более снисходительны и могут быть подходящими, если вам не нужна глубокая структура, доступная через YAML.

person Ross Attrill    schedule 25.03.2013


Вместо стиля файла конфигурации .properties вы можете рассмотреть возможность использования YAML. YAML используется в Ruby on Rails для настройки базы данных и приобрел популярность в других языках (Python, Java, Perl и других).

Обзор модуля Ruby YAML находится здесь: http://www.ruby-doc.org/core/classes/YAML.html

А домашняя страница YAML находится здесь: http://yaml.org/

person Christopher Currie    schedule 19.09.2008