创建一个包装我的config.yml文件的类,并在我的rake文件中使用它

时间:2012-04-23 16:59:33

标签: ruby

这是一个非rails应用程序,只是一个简单的ruby脚本,它使用rake等来自动化一些东西。

我的文件夹布局是:

/scripts/Rakefile
/scripts/config/config.yml
/scripts/tasks/*.rake (various rake files with namespaces to organize them)
/scripts/lib/settings.rb

现在我想创建一个Settings类,它将加载config yaml文件,然后公开yaml文件内容的属性/方法。

yaml文件有单独的部分用于开发和生产。

development:
    scripts_path: '/dev/mygit/app1/scripts/'
production:
    scripts_path: '/var/lib/app1/scripts/'

到目前为止我的rakefile看起来像:

$LOAD_PATH.unshift File.expand_path('..', __FILE__)

#imports
require 'fileutils'
require 'rubygems'
require 'active_record'
require 'yaml'
require 'logger'

require 'ar/models'
require 'lib/app1'

env = ENV['ENV'] || 'development'
config = YAML::load(File.open('config/config.yml'))[env]

Dir.glob('tasks/*.rake').each { |r| import r }

我需要有关Settings.rb文件的帮助,这是对的吗?

module App1
  class Settings
    def initialize(config_path, env)
      config = YAML.load(File.open(config_path))
    end

    def scripts_path
    end

  end
end

如何传入env,然后从配置中读取scripts_path等每个方法的正确值?

现在假设每个* .rake文件需要以某种方式引用我的Settings.rb文件(以获取配置相关信息)。我该怎么做?由于我的设置需要config.yml文件的路径,我是否必须在每个rake文件中执行此操作?

更新的 对不起,这不是Rails应用程序,只是一些ruby脚本。

2 个答案:

答案 0 :(得分:3)

我会这么做很简单。 您不需要复杂的解决方案。

require 'ostruct'
require 'yaml'

MY_ENV = ENV['ENV'] || 'development'
CONFIG = OpenStruct.new(YAML.load_file("config/config.yml")[MY_ENV])

将其粘贴在rakefile的顶部 和CONFIG将在所有佣金任务中使用。

只需致电CONFIG.scripts_path

答案 1 :(得分:1)

在我的应用程序中,我做了类似的事情。

# config/application.yml

development:
  some_variable: a string

production:
  some_variable: a different string

然后在application.rb中加载它。

# config/application.rb

module MyApp

  def self.config
    @config ||= OpenStruct.new(YAML.load_file("config/application.yml")[Rails.env.to_s])
  end

  class Application < Rails::Application
    ...

在这种情况下,在环境加载的任何地方我都可以说

MyApp.config.some_variable

要在rake任务中访问此内容,我只需要包含环境

task :something => :environment do
  MyApp.config.some_variable
  # do something with it
end