使用通配符时,只有一个文件是 运行 in rails runner

When using wildcard, only one file is ran in rails runner

我正在使用 rails 运行ner,我想 运行 一个文件夹中的多个脚本。

这是我的文件结构...

$ ls db/test/

de_test.rb
fr_test.rb
ja_test.rb
....

de_test.rb

puts "DE"

fr_test.rb

puts "FR"

ja_test.rb

puts "JA"

现在如果我运行:

$ bundle exec script/rails runner -e production db/test/de_test.rb
DE
$ bundle exec script/rails runner -e production db/test/fr_test.rb
FR
$ bundle exec script/rails runner -e production db/test/ja_test.rb
JA
$ bundle exec script/rails runner -e production db/test/*test.rb
DE

为什么 db/test/*test.rb 运行 没有所有文件?我该怎么做才能解决这个问题。

这是在 RHEL 上。

Bash glob 只是 shorthand 用于一次写入多个文件名参数:

这个:

bundle exec script/rails runner -e production db/test/*test.rb

将与您编写的内容完全相同:

bundle exec script/rails runner -e production db/test/de_test.rb db/test/fr_test.rb db/test/ja_test.rb

缺少文档,但这很可能只是 运行 de_test.rb 与其他文件一起作为附加的命令行参数。这就是您只看到 DE 的原因。

您想做的是 运行 每个文件一个命令,即:

bundle exec script/rails runner -e production db/test/de_test.rb
bundle exec script/rails runner -e production db/test/fr_test.rb
bundle exec script/rails runner -e production db/test/ja_test.rb

您可以使用 for 循环执行此操作:

for file in db/test/*test.rb;
do
    bundle exec script/rails runner -e production "$file";
done

(如果您愿意,可以将所有内容放在一行中)

我们来分析一下为什么会这样。我从 rails/runner 任务中删除了所有内容。通过说一切,我的意思是与您的问题无关的事情。您可以在您的计算机中查看此代码。

require 'optparse'
code_or_file = nil

puts ARGV
puts code_or_file

if ARGV.first.nil?
  ARGV.push "-h"
end

ARGV.clone.options do |opts|
  opts.order! { |o| code_or_file ||= o } rescue retry
end

puts code_or_file

因此 puts ARGV 将显示每个满足您 db/test/*test.rb 的文件。

puts code_or_file将显示空行(这是正常的,因为变量有nil值)

最后一行 puts code_or_file 将打印 first 文件夹中 lexicographical order.

的文件

那么为什么会这样呢?因为:

opts.order! { |o| code_or_file ||= o } rescue retry

简单地说,它取数组(文件列表)中的第一项。我的建议是rewrite/patchrails/runner任务来解决你的问题。另一种方法是编写@that_other_guy提供的shell脚本。

rails/runner link