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
工作方式的东西(即盲目地将内容粘贴到它所调用的任何范围)可能会起作用.
有任何想法吗?
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)
归档时间: |
|
查看次数: |
1217 次 |
最近记录: |