Ruby备份gem - 共享配置?

dan*_*ain 5 ruby backup configuration dry

我正在使用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
Run Code Online (Sandbox Code Playgroud)

然后备份执行la bundle exec backup perform -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
Run Code Online (Sandbox Code Playgroud)

但这失败了undefined method 'my_db_config' for #<Backup::Database::MySQL:0x10155adf0>.

我的目的是让它工作,然后将公共配置功能拆分成我可以require在每个配置文件中的另一个文件.我还尝试使用配置代码创建一个文件并将require其放入模型定义块中:

# 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
Run Code Online (Sandbox Code Playgroud)

这也行不通,从后来的研究中我发现,这不是那种require有效的方式.更符合C/C++ #include工作方式的东西(即盲目地将内容粘贴到它所调用的任何范围)可能会起作用.

有任何想法吗?

Ben*_*ret 2

gem 似乎修改了配置块的执行范围。要解决这个问题,您可以将函数包装在一个类中:

class MyConfig
  def self.prepare_db(db)
    db.name = "my_database"
    # etc
    db
  end
end

Backup::Model.new(:my_backup, 'My Backup') do
  database MySQL do |db|
    db = MyConfig.prepare_db(db)
  end
  #etc
end
Run Code Online (Sandbox Code Playgroud)

你可以得到更奇特和抽象的默认配置合并:

class BaseConfig
  @@default_sets = 
    :db => {
      :name => "my_database"
    },
    :s3 => {
      :access_key => "my_s3_key"
    }
  }

  def self.merge_defaults(initial_set, set_name)
    @@default_sets[set_name].each do |k, v|
      initial_set.send("#{k}=".to_sym, v)
    end
    initial_set
  end
end

Backup::Model.new(:my_backup, 'My Backup') do
  database MySQL do |db|
    db = BaseConfig.merge_defaults(db, :db)
  end

  store_with S3 do |s3|
    s3 = BaseConfig.merge_defaults(s3, :s3)
  end
end
Run Code Online (Sandbox Code Playgroud)