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_argsremaining_args 然后被另一个正则表达式重复传递切碎:

/((?:[^\,]|\.)*?)\s*(?:,\s*(.*))?$/ =~ remaining_args # Starts as "    1    "

现在 </code> 是 <code>" 1"\s* 正在吃任何单个参数末尾的任何连续白色 space。

那么为什么后面space 保留那些space?

  1. 允许单个space字符在backspace之后存活(被捕获组中的\.捕获)。此外,捕获到后面space 的所有内容。

  2. 然后将参数字符串传递给.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 的副作用。不过我不会依赖它...