Гем резервного копирования Ruby - общие конфигурации?

Я использую гем резервной копии meskyanichi . По большому счету, он делает то, что мне нужно, но мне нужно иметь несколько резервных копий (например, ежечасно, ежедневно, еженедельно). Конфигурации в основном одинаковы, но имеют несколько отличий, поэтому мне нужно иметь несколько файлов конфигурации. У меня возникли проблемы с поиском разумного способа управления общими частями конфигураций (т. Е. Не повторять общие части).

В файлах конфигурации используется множество блочных структур, и, насколько я могу судить, каждая резервная копия должна иметь отдельный файл конфигурации (например, config / backup / hourly.rb, config / backup / daily.rb и т. Д.). Типичный файл конфигурации выглядит следующим образом:

Backup::Model.new(:my_backup, 'My Backup') do

  database MySQL do |db|
    db.name               = "my_database"
    db.username           = "foo"
    db.password           = "bar"
    # etc
  end

  # similar for other config options

end

Затем выполняется резервное копирование как bundle exec backup выполнить -t my_backup -c path / to / config.rb .

Моей первой попыткой включить общую конфигурацию было определение методов, которые я мог вызывать из блоков:

def my_db_config db
  db.name = "my_database"
  # etc
end

Backup::Model.new(:my_backup, 'My Backup') do
  database MySQL do |db|
    my_db_config db
  end
  #etc
end

Но это не удалось с undefined методом 'my_db_config' для # .

Я намеревался заставить это работать, а затем разделить общие функции конфигурации в другой файл, который я мог потребовать в каждом из моих файлов конфигурации. Я также попытался создать файл с кодом конфигурации, и потребовал, чтобы вставил его в блок определения модели:

# common.rb
database MySQL do |db|
  db.name = "my_database"
  #etc
end

# config.rb
Backup::Model.new(:my_backup, 'My Backup') do
  require "common.rb" # with the right path, etc
end

Это тоже не работает, и из последующих исследований я обнаружил, что это просто не так. что требует работает. Может сработать нечто большее, соответствующее тому, как работает #include C / C ++ (т.е. слепая вставка содержимого в любую область, из которой оно вызывается).

Есть идеи?

5
задан dantswain 22 November 2011 в 15:18
поделиться