5

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

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

先感谢您。

4

3 回答 3

7

首先,您可以运行一个写入 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
...
于 2013-07-15T16:56:16.933 回答
3

您可以使用我编写的系统作为neomind-dashboard-public的一部分,这是一个在开源 MIT License 下的独立 Ruby 脚本。

您的项目config文件夹应该包含一个包含config.yml您的配置数据的文件,如下所示

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到您的项目中。这是一个非常小的文件,它使用内置yaml来加载 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
于 2013-07-15T17:39:06.260 回答
0

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

像上面那样写:

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
于 2015-06-03T15:28:11.630 回答