独立ruby脚本的配置文件

时间:2013-07-15 16:49:54

标签: ruby-on-rails ruby

我有一个在linux服务器上运行的ruby脚本。它不使用铁轨或任何东西。它基本上是一个命令行ruby脚本,可以传递这样的参数:./ruby_script.rb arg1 arg2

如何将参数抽象为配置文件,例如yaml文件或其他东西?你能提供一个如何做到这一点的例子吗?

提前谢谢。

3 个答案:

答案 0 :(得分:6)

首先,您可以运行写入YAML配置文件的独立脚本:

require "yaml"
File.write("path_to_yaml_file", [arg1, arg2].to_yaml)

然后,在您的应用中阅读:

require "yaml"
arg1, arg2 = YAML.load_file("path_to_yaml")
# use arg1, arg2
...

答案 1 :(得分:2)

您可以使用我作为neomind-dashboard-public的一部分编写的系统,这是一个独立的Ruby脚本under the open-source MIT License

您的项目config folder应包含config.yml文件及其配置数据,例如this

updater script:
  code URL: https://github.com/NeomindLabs/neomind-dashboard-public

Leftronic dashboard:
  dashboard access key: 'bGVmdHJvbmljaXNhd2Vz' # find on https://www.leftronic.com/api/
  stream names:

    statuses for CI project names:
      "Project Alpha": project_alpha_ci_status
      "Project Beta": project_beta_ci_status
      "Project Gamma": project_gamma_ci_status
# etc.

将文件lib/config_loader.rb复制到您的项目中。这是一个非常小的文件,使用the built-in yaml library加载YAML配置文件。

# encoding: utf-8

require 'yaml'

class ConfigLoader
  def initialize
    load_config_data
  end

  def [](name)
    config_for(name)
  end

  def config_for(name)
    @config_data[name]
  end

  private

  def load_config_data
    config_file_path = 'config/config.yml'
    begin
      config_file_contents = File.read(config_file_path)
    rescue Errno::ENOENT
      $stderr.puts "missing config file"
      raise
    end
    @config_data = YAML.load(config_file_contents)
  end
end

最后,在使用配置文件的每个文件中,遵循此模式(此示例来自文件lib/dashboard_updater.rb):

需要库

require_relative 'config_loader'

使用配置文件中的第一级密钥

加载CONFIG常量
class DashboardUpdater
  CONFIG = ConfigLoader.new.config_for("Leftronic dashboard")

使用CONFIG读取配置数据

  def initialize_updater
    access_key = CONFIG["dashboard access key"]
    @updater = Leftronic.new(access_key)
  end

答案 2 :(得分:0)

使用接受的答案中的方法从YAML文件中读取时遇到undefined local variable or method错误。我用稍微不同的方式做到了:

按上述方式写信:

require "yaml"
File.write("path/to/yaml", ["test_arg_1", "test_arg_2"].to_yaml)

使用稍微的变化阅读:

require "yaml"
arg1, arg2 = YAML.load(File.read("path/to/yaml"))

puts arg1
#=> test_arg_1
puts arg2
#=> test_arg_2