如何在rake任务的字符串参数中使用逗号?

Ben*_*aum 14 ruby rake command-line-interface rakefile

我有以下Rakefile:

task :test_commas, :arg1 do |t, args|
  puts args[:arg1]
end
Run Code Online (Sandbox Code Playgroud)

并希望使用包含逗号的单个字符串参数来调用它.这是我得到的:

%rake 'test_commas[foo, bar]'
foo

%rake 'test_commas["foo, bar"]'
"foo

%rake "test_commas['foo, bar']"
'foo

%rake "test_commas['foo,bar']"
'foo

%rake "test_commas[foo\,bar]"
foo\
Run Code Online (Sandbox Code Playgroud)

我目前正在使用此pull请求中提出的解决方法进行rake,但有没有办法在不修补rake的情况下完成此操作?

Tom*_*art 9

改变耙子是一个非常脏的修复.请尝试使用OptionParser.语法如下

$ rake mytask -- -s 'some,comma,sepparated,string'
Run Code Online (Sandbox Code Playgroud)

--要跳过解析参数的耙路

这是红宝石代码:

task :mytask do
  options = {}

  optparse = OptionParser.new do |opts|
    opts.on('-s', '--string ARG', 'desc of my argument') do |str|
      options[:str] = str
    end

    opts.on('-h', '--help', 'Display this screen') do     
      puts opts                                                          
      exit                                                                      
    end 
  end

  begin 
    optparse.parse!
    mandatory = [:str]
    missing = mandatory.select{ |param| options[param].nil? }
    if not missing.empty?
      puts "Missing options: #{missing.join(', ')}"
      puts optparse
      exit
    end

  rescue OptionParser::InvalidOption, OptionParser::MissingArgument
    puts $!.to_s
    puts optparse
    exit  
  end

  puts "Performing task with options: #{options.inspect}"
  # @TODO add task's code
end
Run Code Online (Sandbox Code Playgroud)


eug*_*gen 7

我不确定这是可能的.看一下lib/rake/application.rb,解析任务字符串的方法是:

def parse_task_string(string)
  if string =~ /^([^\[]+)(\[(.*)\])$/
    name = $1
    args = $3.split(/\s*,\s*/)
  else
    name = string
    args = []
  end 
  [name, args]
end 
Run Code Online (Sandbox Code Playgroud)

看来参数字符串是用逗号分隔的,所以你不能有一个包含逗号的参数,至少在当前的rake-0.9.2中没有.

  • 这已不再是这种情况。逗号现在可以用 \ 转义 (2认同)