5

我正在尝试使用 Thor 创建一个可执行的 ruby​​ 脚本。

我已经为我的任务定义了选项。到目前为止,我有这样的事情

class Command < Thor

  desc "csv2strings CSV_FILENAME", "convert CSV file to '.strings' file"
  method_option :langs, :type => :hash, :required => true, :aliases => "-L", :desc => "languages to convert"
  ...
  def csv2strings(filename)
    ...
  end

  ...
  def config
    args = options.dup
    args[:file] ||= '.csvconverter.yaml'

    config = YAML::load File.open(args[:file], 'r')
  end
end

csv2strings不带参数调用时,我希望调用配置任务,这将设置选项:langs

我还没有找到一个好的方法来做到这一点。

任何帮助将不胜感激。

4

1 回答 1

7

我认为您正在寻找一种通过命令行和配置文件设置配置选项的方法。

这是工头 gem的一个例子。

  def options
    original_options = super
    return original_options unless File.exists?(".foreman")
    defaults = ::YAML::load_file(".foreman") || {}
    Thor::CoreExt::HashWithIndifferentAccess.new(defaults.merge(original_options))
  end

它覆盖该options方法并将配置文件中的值合并到原始选项哈希中。

在您的情况下,以下可能有效:

def csv2strings(name)
  # do something with options
end

private
  def options
    original_options = super
    filename = original_options[:file] || '.csvconverter.yaml'
    return original_options unless File.exists?(filename)
    defaults = ::YAML::load_file(filename) || {}
    defaults.merge(original_options)
    # alternatively, set original_options[:langs] and then return it
  end

(我最近在我的博客上写了一篇关于Foreman的文章,更详细地解释了这一点。)

于 2013-07-31T00:13:45.387 回答