20

私は次のRakefileを持っています:

task :test_commas, :arg1 do |t, args|
  puts args[:arg1]
end

そして、コンマを含む単一の文字列引数でそれを呼び出したいと思います。これが私が得るものです:

%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\

現在、このプルリクエストで提案されている回避策を使用してレーキを作成していますが、レーキにパッチを適用せずにこれを実現する方法はありますか?

4

9 に答える 9

10

レーキの変更はかなり汚い修正です。OptionParser代わりに使用してみてください。構文は次のとおりです

$ rake mytask -- -s 'some,comma,sepparated,string'

--引数を解析するレーキな方法をスキップする必要があります

これがルビーコードです:

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
于 2012-07-18T12:04:18.873 に答える
8

それが可能かどうかはわかりません。を見ると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 

引数の文字列はコンマで分割されているようです。そのため、少なくとも現在のrake-0.9.2では、コンマを含む引数を使用することはできません。

于 2011-08-31T15:29:26.770 に答える
4

ユーゲンはすでに答えました、なぜそれが機能しないのですか?

ただし、おそらく次の回避策が役立つ場合があります。

task :test_commas, :arg1, :arg2 do |t, args|
  arg = args.to_hash.values.join(',')
  puts "Argument is #{arg.inspect}"
end

2つの引数を取りますが、それらを結合して「実際の」引数を取得します。

カンマが複数ある場合は、さらに多くの引数が必要です。


私はいくつかのより深い調査を行い、1つ(または2つ)の解決策を見つけました。完璧な解決策ではないと思いますが、うまくいくようです。

require 'rake'
module Rake
  class Application
    #usage: 
    #   rake test_commas[1\,2\,3]
    def parse_task_string_masked_commas(string)
      if string =~ /^([^\[]+)(\[(.*)\])$/
        name = $1
        args = $3.split(/\s*(?<!\\),\s*/).map{|x|x.gsub(/\\,/,',')}
      else
        name = string
        args = []
      end 
      [name, args]
    end   

    #Usage: 
    #   rake test_commas[\"1,2\",3]
    #" and ' must be masked
    def parse_task_string_combined(string)
      if string =~ /^([^\[]+)(\[(.*)\])$/
        name = $1
        args = $3.split(/(['"].+?["'])?,(["'].+?["'])?/).map{|ts| ts.gsub(/\A["']|["']\Z/,'') }
        args.shift if args.first.empty?
      else
        name = string
        args = []
      end 
      [name, args]
    end   

    #~ alias :parse_task_string :parse_task_string_masked_commas
    alias :parse_task_string :parse_task_string_combined

  end

end
desc 'Test comma separated arguments'
task :test_commas, :arg1  do |t, args|
  puts '---'
  puts "Argument is #{args.inspect}"
end

このバージョンparse_task_string_masked_commasでは、マスクされたコンマを使用した呼び出しが許可されています。

rake test_commas[1\,2\,3]

バージョンでは、次のparse_task_string_combinedことが可能です。

rake test_commas[\"1,2,3\"]

少なくともウィンドウでは、 "(または')をマスクする必要があります。マスクしない場合、文字列がRake :: Aplication(おそらくシェル置換)に到達するまで、それらはすでに削除されています。

于 2011-08-31T19:10:54.397 に答える
3

で脱出してみ,ました\か?

于 2011-08-31T14:12:54.133 に答える
3

レーキタスク変数は一般的にあまり便利ではありませんが、代わりに環境変数を使用してください。

task :my_task do
  ENV["MY_ARGUMENT"].split(",").each_with_index do |arg, i|
    puts "Argument #{i}: #{arg}"
  end
end

次に、で呼び出すことができます

MY_ARGUMENT=foo,bar rake my_task

またはあなたが好むなら

rake my_task MY_ARGUMENT=foo,bar
于 2015-07-22T16:57:45.587 に答える
2

# rake -v 10.5

rake test_commas\['foo\,bar'\]

チャームのように機能します。

于 2017-06-13T14:49:40.073 に答える
2

rakeバージョン12.3.2の場合、

rake test_commas ["foo \、bar"]

うまくいく

于 2019-09-18T17:49:29.830 に答える
1

もう1つの簡単な回避策は、引数に別の区切り文字を使用することです。

パイプに交換するのはとても簡単です| カンマ区切りの引数の代わりに文字(または別の)。この場合、Rakeは引数を正しく解析し、配列の最初の引数を分割できるようにします。

desc 'Test pipe separated arguments'
task :test_pipes, :arg1, :arg2  do |t, args|
  puts ":arg1 is: #{ args[:arg1] }"
  puts ":arg2 still works: #{ args[:arg2] }"
  puts "Split :arg1 is: #{ args[:arg1].split('|') }"
end

それを呼び出す:

rake test_pipes["foo|bar",baz]
于 2014-05-20T16:49:52.243 に答える
0

各文字列を記号に変換できます、As、

task :create do   
ARGV.each { |a| task a.to_sym do ; end }
 puts ARGV[1]
 puts ARGV[2]
 puts ARGV[3]
 puts ARGV[4]     
end
end

として実行、

rake create '1、s''2''ww ww''w、w'

于 2016-12-09T07:13:38.353 に答える