【问题标题】:How to parse rake arguments with OptionParser如何使用 OptionParser 解析 rake 参数
【发布时间】:2015-03-22 12:29:26
【问题描述】:

引用that answer 我试图使用OptionParser 来解析rake 参数。我从那里简化了示例,我必须添加两个 ARGV.shift 才能使其工作。

require 'optparse'

namespace :user do |args|

  # Fix I hate to have here
  puts "ARGV: #{ARGV}"
  ARGV.shift
  ARGV.shift
  puts "ARGV: #{ARGV}"

  desc 'Creates user account with given credentials: rake user:create'
  # environment is required to have access to Rails models
  task :create => :environment do
    options = {}
    OptionParser.new(args) do |opts|      
      opts.banner = "Usage: rake user:create [options]"
      opts.on("-u", "--user {username}","Username") { |user| options[:user] = user }
    end.parse!

    puts "user: #{options[:user]}"

    exit 0
  end
end

这是输出:

$ rake user:create -- -u foo
ARGV: ["user:create", "--", "-u", "foo"]
ARGV: ["-u", "foo"]
user: foo

我认为ARGV.shift 不应该这样做。我想知道为什么没有它就无法工作以及如何以适当的方式修复它。

【问题讨论】:

  • 当您尝试使用rake user:create -- -u foo 时,有什么方法可以避免使用exit(0)rake 而不是抛出"Don't know how to build task 'foo'"?如果您不想让rake 停在那里怎么办? OptionParser#parse 不允许使用 -u=foo...

标签: ruby-on-rails ruby rake rake-task


【解决方案1】:

您必须在 -ufoo 之间添加一个“=”:

$ rake user:create -- -u=foo

代替:

$ rake user:create -- -u foo

【讨论】:

  • ARGV.shift 一起使用或不使用=。不幸的是,没有ARGV.shift,无论我是否使用=,它都不起作用。
  • 问题是如何在 Rake 中解析通用参数,而不是如何在 rails 的 Rake 中传递参数。
【解决方案2】:

我知道这并不能严格回答您的问题,但您是否考虑过使用任务参数?

这样您就不必再摆弄OptionParserARGV

namespace :user do |args|
  desc 'Creates user account with given credentials: rake user:create'
  task :create, [:username] => :environment do |t, args|
    # when called with rake user:create[foo],
    # args is now {username: 'foo'} and you can access it with args[:username]
  end
end

有关详细信息,请参阅this answer here on SO

【讨论】:

    【解决方案3】:

    您可以使用OptionParser#order! 方法,它返回没有错误参数的 ARGV:

    options = {}
    
    o = OptionParser.new
    
    o.banner = "Usage: rake user:create [options]"
    o.on("-u NAME", "--user NAME") { |username|
      options[:user] = username
    }
    args = o.order!(ARGV) {}
    o.parse!(args)
    puts "user: #{options[:user]}"
    

    你可以这样传递参数:$ rake foo:bar -- '--user=john'

    【讨论】:

      【解决方案4】:

      试试这个:

      require 'optparse'
      
      namespace :programs do |args|
        desc "Download whatever"
        task :download => [:environment] do
      
          # USAGE: rake programs:download -- rm
          #-- Setting options $ rake programs:download -- --rm
          options = {}
          option_parser = OptionParser.new
          option_parser.banner = "Usage: rake programs:download -- rm"
          option_parser.on("-r", "--rm","Remove s3 files downloaded") do |value|
            options[:remove] = value
          end
          args = option_parser.order!(ARGV) {}
          option_parser.parse!(args)
          #-- end
      
          # your code here
        end
      end
      

      【讨论】:

      • 欢迎来到 Stack Overflow。请查看How to Answer 以获取有关给出最佳答案的提示。例如,如果您在答案中显示最相关的代码以及链接的一些上下文,以防将来用户遇到类似问题时它们不可用,这将很有帮助。
      猜你喜欢
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 2013-05-18
      • 2018-08-09
      • 1970-01-01
      相关资源
      最近更新 更多