Rake 从参数中删除尾随空格。如何预防?
Rake removes trailing whitespaces from parameters. How to prevent?
有一个简单的 rake 任务:
task :ws, [:str] => :environment do |t, args|
puts args.str.inspect
end
在命令行中 运行 此任务时,我得到以下结果:
$ rake ws[' ']
nil
$ rake ws[' ']
nil
$ rake ws[' 1']
" 1"
$ rake ws[' 1 ']
" 1"
$ rake 'ws[ ]'
nil
$ rake 'ws[ ]'
nil
$ rake 'ws[ 1]'
" 1"
$ rake 'ws[ 1 ]'
" 1"
当在 rails 控制台中调用任务时,一切都按预期工作:
2.3.3 :258 > Rake::Task['ws'].invoke(' ')
" "
2.3.3 :259 > Rake::Task['ws'].reenable
2.3.3 :260 > Rake::Task['ws'].invoke(' ')
" "
2.3.3 :261 > Rake::Task['ws'].reenable
2.3.3 :262 > Rake::Task['ws'].invoke(' 1')
" 1"
2.3.3 :263 > Rake::Task['ws'].reenable
2.3.3 :264 > Rake::Task['ws'].invoke(' 1 ')
" 1 "
同样,绝对不是 OS 对 trim 负责,因为它不应该 trim 引号之间的任何内容。此外,它可以通过这种方式轻松测试:
task :ws, [:str] => :environment do |t, args|
puts args.str.inspect
puts ARGV[1].inspect
end
然后在命令行中:
$ rake 'ws[ 1 ]' ' 2 '
" 1"
" 2 "
当任务在命令行中 运行 时,能否以某种方式保留尾随空格?不使用命令行参数(上例中的' 2 '
),因为 Rake 会尝试为每个这样的参数执行一个任务,如果没有找到任务,将引发错误,或者如果找到任务则更糟将执行它。
耙子版本 12.0.0
您可以在白色 space 的末尾转义单个 space 字符,如下所示:
rake 'ws[ 2 \ ]'
" 2 "
这似乎符合您的要求。
反斜杠作为参数的一部分传递,反斜杠-space 对在另一层中被解释为 space(有意还是无意?)。
看看Rake::Application#parse_task_string
。你可以在 irb 中自己做实验,例如
Rake::Application.new.parse_task_string('ws[ 1 ]')
=> ["ws", [" 1"]]
Rake::Application.new.parse_task_string('ws[ 1 \ ]')
=> ["ws", [" 1 "]]
我真的想通过这个来查看发生了什么。
首先它会像这样拆分您的任务名称和参数:
/^([^\[]+)(?:\[(.*)\])$/ =~ 'ws[ 1 ]'
现在 </code> 中有 <code>"ws"
,</code> 中有 <code>" 1 "
。到目前为止一切都很好。 </code> 变为 <code>remaining_args
。 remaining_args
然后被另一个正则表达式重复传递切碎:
/((?:[^\,]|\.)*?)\s*(?:,\s*(.*))?$/ =~ remaining_args # Starts as " 1 "
现在 </code> 是 <code>" 1"
! \s*
正在吃任何单个参数末尾的任何连续白色 space。
那么为什么后面space 保留那些space?
允许单个space字符在backspace之后存活(被捕获组中的\.
捕获)。此外,捕获到后面space 的所有内容。
然后将参数字符串传递给.gsub(/\(.)/, '')
。这会将 backspace-anything
替换为 anything
。所以后面的space-space对被替换为space。 我想知道他们为什么不只是 .gsub(/\/, '')
? 一定是允许转义反斜杠。
当前的实现将另外保留一个 backspace,无论出于何种原因,它恰好是参数末尾的最后一个字符。作为副作用,似乎以反斜杠(甚至是转义的反斜杠)结束单个参数会将整个参数变成空字符串,例如
Rake::Application.new.parse_task_string('task[tears in rain\]')
=>["task", [""]]
这很有趣(例如,如果您需要传递 Windows 目录)。
Rake::Application.new.parse_task_string('task[C:\Johnny\Likes\Windows\]')
=>["task", [""]]
我猜想作者的意图是让你转义逗号以避免分割参数字符串。它有让你通过 whitespace 的副作用。不过我不会依赖它...
有一个简单的 rake 任务:
task :ws, [:str] => :environment do |t, args|
puts args.str.inspect
end
在命令行中 运行 此任务时,我得到以下结果:
$ rake ws[' ']
nil
$ rake ws[' ']
nil
$ rake ws[' 1']
" 1"
$ rake ws[' 1 ']
" 1"
$ rake 'ws[ ]'
nil
$ rake 'ws[ ]'
nil
$ rake 'ws[ 1]'
" 1"
$ rake 'ws[ 1 ]'
" 1"
当在 rails 控制台中调用任务时,一切都按预期工作:
2.3.3 :258 > Rake::Task['ws'].invoke(' ')
" "
2.3.3 :259 > Rake::Task['ws'].reenable
2.3.3 :260 > Rake::Task['ws'].invoke(' ')
" "
2.3.3 :261 > Rake::Task['ws'].reenable
2.3.3 :262 > Rake::Task['ws'].invoke(' 1')
" 1"
2.3.3 :263 > Rake::Task['ws'].reenable
2.3.3 :264 > Rake::Task['ws'].invoke(' 1 ')
" 1 "
同样,绝对不是 OS 对 trim 负责,因为它不应该 trim 引号之间的任何内容。此外,它可以通过这种方式轻松测试:
task :ws, [:str] => :environment do |t, args|
puts args.str.inspect
puts ARGV[1].inspect
end
然后在命令行中:
$ rake 'ws[ 1 ]' ' 2 '
" 1"
" 2 "
当任务在命令行中 运行 时,能否以某种方式保留尾随空格?不使用命令行参数(上例中的' 2 '
),因为 Rake 会尝试为每个这样的参数执行一个任务,如果没有找到任务,将引发错误,或者如果找到任务则更糟将执行它。
耙子版本 12.0.0
您可以在白色 space 的末尾转义单个 space 字符,如下所示:
rake 'ws[ 2 \ ]'
" 2 "
这似乎符合您的要求。
反斜杠作为参数的一部分传递,反斜杠-space 对在另一层中被解释为 space(有意还是无意?)。
看看Rake::Application#parse_task_string
。你可以在 irb 中自己做实验,例如
Rake::Application.new.parse_task_string('ws[ 1 ]')
=> ["ws", [" 1"]]
Rake::Application.new.parse_task_string('ws[ 1 \ ]')
=> ["ws", [" 1 "]]
我真的想通过这个来查看发生了什么。
首先它会像这样拆分您的任务名称和参数:
/^([^\[]+)(?:\[(.*)\])$/ =~ 'ws[ 1 ]'
现在 </code> 中有 <code>"ws"
,</code> 中有 <code>" 1 "
。到目前为止一切都很好。 </code> 变为 <code>remaining_args
。 remaining_args
然后被另一个正则表达式重复传递切碎:
/((?:[^\,]|\.)*?)\s*(?:,\s*(.*))?$/ =~ remaining_args # Starts as " 1 "
现在 </code> 是 <code>" 1"
! \s*
正在吃任何单个参数末尾的任何连续白色 space。
那么为什么后面space 保留那些space?
允许单个space字符在backspace之后存活(被捕获组中的
\.
捕获)。此外,捕获到后面space 的所有内容。然后将参数字符串传递给
.gsub(/\(.)/, '')
。这会将backspace-anything
替换为anything
。所以后面的space-space对被替换为space。我想知道他们为什么不只是一定是允许转义反斜杠。.gsub(/\/, '')
?
当前的实现将另外保留一个 backspace,无论出于何种原因,它恰好是参数末尾的最后一个字符。作为副作用,似乎以反斜杠(甚至是转义的反斜杠)结束单个参数会将整个参数变成空字符串,例如
Rake::Application.new.parse_task_string('task[tears in rain\]')
=>["task", [""]]
这很有趣(例如,如果您需要传递 Windows 目录)。
Rake::Application.new.parse_task_string('task[C:\Johnny\Likes\Windows\]')
=>["task", [""]]
我猜想作者的意图是让你转义逗号以避免分割参数字符串。它有让你通过 whitespace 的副作用。不过我不会依赖它...