如何在 rake db:seed 期间在终端中获得动态输出

How to get dynamic output in terminal during rake db:seed

我正在处理一个相当冗长的 seed.rb 文件。

由于 rake 任务需要一段时间才能完成,我想通过控制台向用户提供视觉反馈,以便他们知道进程正在运行。

到目前为止,我有:

puts "Topic: #{i}, created..."

在创建循环中。但是,它会向终端输出发送垃圾邮件。我想要做的是让输出看起来像这样:

Topic: #1..N, created...

输出都在同一行,没有创建 /n 换行符,就像当前输出的样子:

Topic: #1, created...
Topic: #2, created...
Topic: #3, created...
Topic: #N, created...

我试过用 print 来代替,但它只是在终端行的末尾创建了一个长字符串。

这是完整的 seed.rb 代码:

topic_list = []
i = 1
(0..9).map{
  topic_list << [ Faker::Lorem.words(rand(2..5)), Faker::Lorem.sentences(rand(3..7)), rand(1..6) ]
}
topic_list.each do |title, content, author|
  Topic.create!( title:title, content:content, author:author )
  puts "Topic: #{i}, #{title} created..."
  i += 1
end

有什么想法吗?

使用控制台是老套路,与使用浏览器和 HTML 呈现的页面有很大不同。

控制台使用“\t”、“\r”、“\n”等回车控制字符。有others,但这些是最常用的。

“\r”和“\n”齐头并进。 “\r”表示return回车到原位,“\n”表示前进到下一行。在终端中,“\r”导致将光标移动到最左侧的位置。

将其保存到脚本中并运行它在命令行中:

print "foo\r"
sleep 1
print "bar\r"
sleep 1
puts "done"

你会看到打印出 "foo",光标在 "f" 上,然后是 "bar",光标在 "b" 上,然后打印出 "done"并且光标会移动到下一行。

puts 的行为不同于 print;为什么留给你去发现。

此外,如果某些行的长度比其他行短,仅附加“\r”不足以生成美观的进度消息。互联网上有很多不同的教程介绍如何处理这个问题,我相信有 Ruby 个包。一些搜索应该揭示这些。