<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>enalix (enalix)</title>
    <link>https://ruby-china.org/enalix</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>如何在 Rake 的 task 中使用 ruby-progressbar</title>
      <description>&lt;p&gt;代码如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;pb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ProgressBar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;title: &lt;/span&gt;&lt;span class="s2"&gt;"标题"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 创建进度条&lt;/span&gt;
&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:abc&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;  &lt;span class="c1"&gt;# 定义一个普通的任务&lt;/span&gt;
  &lt;span class="n"&gt;dir_ary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Dir&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# 获取当前目录下所有的文件&lt;/span&gt;
  &lt;span class="n"&gt;pb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dir_ary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;  &lt;span class="c1"&gt;# 设置进度条的长度&lt;/span&gt;
  &lt;span class="no"&gt;Dir&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;pb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;  &lt;span class="c1"&gt;# 进度加1&lt;/span&gt;
    &lt;span class="n"&gt;rm&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rf&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="n"&gt;pb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reset&lt;/span&gt;  &lt;span class="c1"&gt;# 重置进度条&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;ruby-progressbar&lt;/code&gt;是一个广泛使用的终端进度条显示，我之前使用过，代码中即最通常的用法。&lt;/p&gt;

&lt;p&gt;但问题是，在&lt;code&gt;shell&lt;/code&gt;中执行&lt;code&gt;rake abc&lt;/code&gt;, 它一定会输出&lt;code&gt;rm -rf xxx&lt;/code&gt;, 即它执行过的命令。且每次输出都会刷新&lt;code&gt;stdout&lt;/code&gt;缓冲区。&lt;/p&gt;

&lt;p&gt;而终端条的基本原理是，在输出进度时，&lt;code&gt;stdout&lt;/code&gt;缓冲区不能刷新，不然会看到：进度条每加 1, 则换行，加 1, 换行，头疼。&lt;/p&gt;

&lt;p&gt;问题：如何让&lt;code&gt;rake&lt;/code&gt;执行任务时，不输出也不刷新缓冲区。应该有代码可以配置，但我个人没有仔细研究过&lt;code&gt;rake&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;关于在别的进程执行&lt;code&gt;shell&lt;/code&gt;命令，使用类似&lt;code&gt;openx&lt;/code&gt;或&lt;code&gt;system&lt;/code&gt;等不考虑。代码中的&lt;code&gt;rm&lt;/code&gt;是&lt;code&gt;FileUtils&lt;/code&gt;模块中的方法。&lt;/p&gt;

&lt;p&gt;还有&lt;code&gt;&amp;gt;/dev/null&lt;/code&gt;就更不考虑了，因为任务中的&lt;code&gt;puts&lt;/code&gt;显示输出，我还是需要的。&lt;/p&gt;

&lt;p&gt;求大神解答。我个人最近看来要细看下&lt;code&gt;rake&lt;/code&gt;了，如果有答案也会贴出。&lt;/p&gt;

&lt;p&gt;===================================================================================&lt;/p&gt;

&lt;p&gt;问题更新：&lt;/p&gt;

&lt;p&gt;今天又看了点东西，探索了下，这问题其实涉及两个方面：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Rake&lt;/code&gt;的&lt;code&gt;task&lt;/code&gt;如何写，或者如何配置，能达到&lt;code&gt;rake -s task_name&lt;/code&gt;命令行执行的效果，即默认静默执行&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ruby-progressbar&lt;/code&gt;似乎在写文件的迭代中，会不断的换行&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;第一个问题，我还不知道，但似乎定位了第二个问题。下面代码可执行，可反映问题。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;pb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ProgressBar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;title: &lt;/span&gt;&lt;span class="s2"&gt;"下载"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;total: &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;format: &lt;/span&gt;&lt;span class="s1"&gt;'%t (%c %C) |%B| %p%%'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; 
  &lt;span class="n"&gt;pb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt; 
  &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"hello/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="nb"&gt;sleep&lt;/span&gt;  &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="c1"&gt;# 写文件的速度太快, 刻意等1秒&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果就是进度每加 1, 则换行。&lt;/p&gt;

&lt;p&gt;就个人有限的知道来看，似乎是跟&lt;code&gt;write&lt;/code&gt;方法有关，猜测此方法可能给&lt;code&gt;stdout&lt;/code&gt;加&lt;code&gt;\n&lt;/code&gt;换行符了。具体不解。&lt;/p&gt;

&lt;p&gt;非常抱歉，第一段代码，似乎不能重现问题。&lt;/p&gt;</description>
      <author>enalix</author>
      <pubDate>Thu, 25 Aug 2016 23:22:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/30908</link>
      <guid>https://ruby-china.org/topics/30908</guid>
    </item>
  </channel>
</rss>
