﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-xan walking &amp; thinking-随笔分类-script language</title><link>http://www.blogjava.net/xan/category/31252.html</link><description>watch and learn</description><language>zh-cn</language><lastBuildDate>Fri, 09 May 2008 12:49:30 GMT</lastBuildDate><pubDate>Fri, 09 May 2008 12:49:30 GMT</pubDate><ttl>60</ttl><item><title>[转载]比较冷幽默的rake使用指南</title><link>http://www.blogjava.net/xan/archive/2008/05/09/199533.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Fri, 09 May 2008 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/05/09/199533.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/199533.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/05/09/199533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/199533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/199533.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt;">
<span style="font-size: 10pt;">
原文地址： http://blog.csdn.net/smilewater/archive/2007/07/09/1683808.aspx <br />
<br />
<p style="margin-bottom: 0.14in;" class="western"><strong>Rake</strong><font face="宋体, SimSun"><strong>和</strong></font><strong>Make</strong><font face="宋体, SimSun"><strong>及</strong></font><strong>Ant</strong></p>
<p style="margin-bottom: 0.14in;" class="western">Rake<font face="宋体, SimSun">的意思是</font>Ruby Make<font face="宋体, SimSun">，一个用</font>ruby<font face="宋体, SimSun">开发的代码构建工具。</font>Rake<font face="宋体, SimSun">的英文意思是耙子，一种很朴实的劳动工具。真的是很贴切，</font>Rake<font face="宋体, SimSun">正是一个功能强大、勤勤恳恳的劳动工具。</font></p>
<p style="margin-bottom: 0.14in;" class="western">Rake<font face="宋体, SimSun">会经常跟</font>C/C++<font face="宋体, SimSun">领域的</font>make<font face="宋体, SimSun">和</font>Java<font face="宋体, SimSun">世界的</font>Ant<font face="宋体, SimSun">进行对照，事实上，它们有很多相似的地方。我们先来看一下</font>make<font face="宋体, SimSun">和</font>ant<font face="宋体, SimSun">的历史。</font></p>
<p style="margin-bottom: 0.14in;" class="western">make<font face="宋体, SimSun">的出现是为了解决批量编译的问题。对于一个小型的项目来说，用一个脚本文件或者批处理命令来进行批量编译就已经足够好。但是对于大型的项目来说，仅仅为了少数几个文件的改变就全部重新进行一次编译无疑是耗时且不必要的。而且，在大型的项目中，往往会有很复杂的依赖关系。</font></p>
<p style="margin-bottom: 0.14in;" class="western">Make<font face="宋体, SimSun">的出现就是为了解决这两个问题，</font>make<font face="宋体, SimSun">有两个优点：</font></p>
<ol>
    <li>
    <p style="margin-bottom: 0.14in;">Make<font face="宋体, SimSun">了解自上次</font>Make<font face="宋体, SimSun">运行以来哪些文件发生了变化，它会仅仅编译那些发生变化的文件。</font></p>
    </li>
    <li>
    <p style="margin-bottom: 0.14in;">Make<font face="宋体, SimSun">会跟踪文件之间的依赖性，如果文件</font>A<font face="宋体, SimSun">依赖于文件</font>B<font face="宋体, SimSun">，那么如果两者都没有编译时，</font>Make<font face="宋体, SimSun">会首先编译文件</font>B<font face="宋体, SimSun">。</font></p>
    </li>
</ol>
<p style="margin-bottom: 0.14in;" class="western">Ant<font face="宋体, SimSun">算是一个</font>Java<font face="宋体, SimSun">世界的</font>make<font face="宋体, SimSun">，它要比</font>make<font face="宋体, SimSun">年轻许多（想想</font>make<font face="宋体, SimSun">是出现在</font>1972<font face="宋体, SimSun">年吧），它除了支持批量编译之外，还支持单元测试、</font>JavaDoc<font face="宋体, SimSun">等任务。因此，</font>Ant<font face="宋体, SimSun">在</font>Java<font face="宋体, SimSun">世界中比</font>Make<font face="宋体, SimSun">更加流行。</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun"><strong>但是，为什么</strong></font><strong>Ruby</strong><font face="宋体, SimSun"><strong>需要</strong></font><strong>Rake</strong><font face="宋体, SimSun"><strong>？</strong></font></p>
<p style="margin-bottom: 0.14in;" class="western">Ruby<font face="宋体, SimSun">代码不需要编译，为什么需要</font>Rake<font face="宋体, SimSun">？其实，与其说</font>Rake<font face="宋体, SimSun">是一个代码构建工具，不如说</font>Rake<font face="宋体, SimSun">是一个任务管理工具，通过</font>Rake<font face="宋体, SimSun">我们可以得到两个好处：</font></p>
<ol>
    <li>
    <p style="margin-bottom: 0.14in;"><font face="宋体, SimSun">以任务的方式创建和运行脚本</font></p>
    </li>
</ol>
<p style="margin-left: 0.25in; margin-bottom: 0.14in;"><font face="宋体, SimSun">当然，你可以用脚本来创建每一个你希望自动运行的任务。但是，对于大型的应用来说，你几乎总是需要为数据库迁移（比如</font>Rails<font face="宋体, SimSun">中</font>db:migrate<font face="宋体, SimSun">任务）、清空缓存、或者代码维护等等编写脚本。对于每一项任务，你可能都需要写若干脚本，这会让你的管理变得复杂。那么，把它们用任务的方式整理到一起，会让管理变得轻松很多。</font></p>
<ol start="2">
    <li>
    <p style="margin-bottom: 0.14in;"><font face="宋体, SimSun">追踪和管理任务之间的依赖</font></p>
    </li>
</ol>
<p style="margin-left: 0.25in; margin-bottom: 0.14in;">Rake<font face="宋体, SimSun">还提供了轻松管理任务之间依赖的方式。比如，&#8220;</font>migrate&#8221;<font face="宋体, SimSun">任务和&#8220;</font>schema<font face="宋体, SimSun">：</font>dump&#8221;<font face="宋体, SimSun">任务都依赖于 &#8220;</font>connect_to_database&#8221;<font face="宋体, SimSun">任务，那么在&#8220;</font>migrate&#8221;<font face="宋体, SimSun">任务调用之前，&#8220;</font>connect_to_database&#8221;<font face="宋体, SimSun">任务都会被执行。</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun"><strong>在哪里可以获得</strong></font><strong>Rake</strong><font face="宋体, SimSun"><strong>？</strong></font></p>
<p style="margin-bottom: 0.14in;" class="western">Rake<font face="宋体, SimSun">的主页是在</font><font color="#0000ff"><u><a href="http://rake.rubyforge.org/">http://rake.rubyforge.org/</a></u></font><font face="宋体, SimSun">，在这里你可以获得</font>Rake<font face="宋体, SimSun">的简单介绍，</font>API<font face="宋体, SimSun">以及一些有用文档的链接。可以在</font><font color="#0000ff"><u><a href="http://rubyforge.org/frs/?group_id=50">http://rubyforge.org/frs/?group_id=50</a></u></font><font face="宋体, SimSun">获得最新版的</font>Rake<font face="宋体, SimSun">，在作者写作时，最新版本是</font>0.7.3<font face="宋体, SimSun">。</font></p>
<h3>Rake<font face="宋体, SimSun">脚本编写</font></h3>
<h4><font face="宋体, SimSun">一个简单脚本</font></h4>
<p style="margin-bottom: 0.14in;" class="western">Rake<font face="宋体, SimSun">的脚本相当简单，下面用一个例子进行说明。假设你是一个勤劳的家庭型程序员，在周末你打算为你的家人做一些贡献。所以你为自己制定了三个任务：买菜、做饭和洗衣服。打开你的文本编辑器，创建一个名叫</font>rakefile<font face="宋体, SimSun">的文件（</font>Rake<font face="宋体, SimSun">会在当前路径下寻找名叫</font>Rakefile<font face="宋体, SimSun">、</font>rakefile<font face="宋体, SimSun">、</font>RakeFile.rb<font face="宋体, SimSun">和</font>rakefile.rb<font face="宋体, SimSun">的</font>rake<font face="宋体, SimSun">文件），并输入如下内容：</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">desc "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">1 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">买菜</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
task :purchaseVegetables do<br />
puts "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">到沃尔玛去买菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
end<br />
<br />
desc "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">2 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">做饭</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
task :cook do<br />
puts "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">做一顿香喷喷的饭菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
end<br />
<br />
desc "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">3 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">洗衣服</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
task :laundry  do<br />
puts "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">把所有衣服扔进洗衣机。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
end<br />
</font></font><br />
<br />
</p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">打开命令行工具，进入这个文件所在目录，然后运行下面的命令，大致应该类似如下结果：</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">D:"work"ruby_works"ruby_book&gt;rake purchaseVegetables<br />
(in D:/work/ruby_works/ruby_book) <br />
</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">到沃尔玛去买菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
<br />
D:"work"ruby_works"ruby_book&gt;rake cook<br />
(in D:/work/ruby_works/ruby_book) <br />
</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">做一顿香喷喷的饭菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
<br />
D:"work"ruby_works"ruby_book&gt;rake laundry<br />
(in D:/work/ruby_works/ruby_book) <br />
</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">把所有衣服扔进洗衣机。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
</font></font><br />
<br />
</p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2"><strong>分析</strong></font></font></p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">很简单，也很易读，对吧。这个文件一共定义了</font>3<font face="宋体, SimSun">个任务，</font>desc<font face="宋体, SimSun">是</font>Rake<font face="宋体, SimSun">定义的方法，表示对下面定义任务的描述。这个描述会在使用</font>Rake --tasks<font face="宋体, SimSun">（或者</font>Rake -T<font face="宋体, SimSun">，为懒人准备的快捷方式）命令时输出在屏幕上。</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">D:"work"ruby_works"ruby_book&gt;rake --tasks<br />
(in D:/work/ruby_works/ruby_book) <br />
rake cook                # </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">2 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">做饭</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
rake laundry             # </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">3 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">洗衣服</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
rake purchaseVegetables  # </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">1 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">买菜</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
</font></font><br />
<br />
</p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">下面的语句定义了</font>purchaseVegetables<font face="宋体, SimSun">这个任务，</font>task<font face="宋体, SimSun">是</font>Rake<font face="宋体, SimSun">最重要的方法。它的方法定义是：</font><strong>task</strong>(args, &amp;block)<font face="宋体, SimSun">。任务体是一个</font>block<font face="宋体, SimSun">，本例中只是简单输出你所要做的工作。需要注意的是代码</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">puts "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">到沃尔玛去买菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"</font></font></p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">完全是一个普通的</font>Ruby<font face="宋体, SimSun">语句，</font>puts<font face="宋体, SimSun">是</font>Ruby<font face="宋体, SimSun">中进行输出的一般性方法，可以看出，</font>Rake<font face="宋体, SimSun">任务可以完全使用</font>Ruby<font face="宋体, SimSun">的能力，这使得它非常强大。</font></p>
<h4><font face="宋体, SimSun">加入依赖关系</font></h4>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">很显然，在我们定义的任务中，做饭是依赖于买菜的（我相信大多数程序员在周末的冰箱里除了可乐没有别的）。那么，我们需要在我们的任务定义中加入这个依赖关系，修改后的文件如下：</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">desc "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">1 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">买菜</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
task :purchaseVegetables do<br />
puts "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">到沃尔玛去买菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
end<br />
<br />
desc "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">2 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">做饭</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
task <strong>:cook =&gt; :purchaseVegetables</strong> do<br />
puts "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">做一顿香喷喷的饭菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
end<br />
<br />
desc "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">3 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">洗衣服</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
task :laundry  do<br />
puts "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">把所有衣服扔进洗衣机。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
end<br />
</font></font><br />
<br />
</p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">再次运行做饭任务，你会得到如下结果：</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">D:"work"ruby_works"ruby_book&gt;rake cook<br />
(in D:/work/ruby_works/ruby_book) <br />
</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">到沃尔玛去买菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">做一顿香喷喷的饭菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
</font></font><br />
<br />
</p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">是的，你当然需要先买菜，谁让你是一个冰箱空空如野的程序员呢。</font></p>
<h4><font face="宋体, SimSun">命名空间</font></h4>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">跟任何编程语言类似，当你的</font>rake<font face="宋体, SimSun">文件很多时，当你有很多任务的时候，你需要关注它们的命名冲突问题，命名空间（</font>namespace<font face="宋体, SimSun">）就是一个自然的解决方案。你可以为上面的三个任务定义一个叫做</font>home<font face="宋体, SimSun">的命名空间。</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><strong>namespace :home do</strong><br />
desc "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">1 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">买菜</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
task :purchaseVegetables do<br />
puts "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">到沃尔玛去买菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
end<br />
&#8230;&#8230;<br />
<strong>end</strong><br />
</font></font><br />
<br />
</p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">再次运行</font>rake --tasks<font face="宋体, SimSun">，你会得到如下的结果：</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">D:"work"ruby_works"ruby_book &gt;rake --tasks<br />
(in D:/work/ruby_works/ruby_book) <br />
rake <strong>home:cook</strong>                # </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">2 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">做饭</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
rake <strong>home:laundry</strong>             # </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">3 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">洗衣服</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
rake <strong>home:purchaseVegetables</strong>  # </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">1 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">买菜</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
</font></font><br />
<br />
</p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">你现在需要使用</font>rake home:cook<font face="宋体, SimSun">才能启动做饭这个任务了。当然，你可以在你的</font>rakefile<font face="宋体, SimSun">中使用多个命名空间，对任务进行分类。</font></p>
<h4><font face="宋体, SimSun">在一个任务中调用另外一个任务</font></h4>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">当任务众多的时候，你很可能需要在一个任务中调用另外一个任务，假设我们把今天所有要做的工作定义为一个任务：</font>today<font face="宋体, SimSun">。在这个任务中，有两个任务需要被调用，一个是做饭，一个是洗衣服。当然，由于做饭依赖于买菜，我们还是需要买菜的（这一步是逃不过去的，呵呵）。在文件的顶部定义一个</font>today<font face="宋体, SimSun">的任务：</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">desc "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">今天的任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
task :today do<br />
Rake::Task["home:cook"].invoke<br />
Rake::Task["home:laundry"].invoke<br />
end<br />
<br />
namespace :home do<br />
&#8230;&#8230;<br />
end<br />
</font></font><br />
<br />
</p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">可以看出，调用其它任务的方式很简单，只需要调用</font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">Rake::Task["task_name"].invoke</font></font> <font face="宋体, SimSun">方法就可以了。在命令行中启动</font>rake today<font face="宋体, SimSun">，可以得到：</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">D:"work"ruby_works"ruby_book &gt;rake today<br />
(in D:/work/ruby_works/ruby_book) <br />
</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">到沃尔玛去买菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">做一顿香喷喷的饭菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">把所有衣服扔进洗衣机。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace"><br />
</font></font><br />
<br />
</p>
<h4><font face="宋体, SimSun">默认任务</font></h4>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">可以为</font>Rake<font face="宋体, SimSun">增加一个默认任务，这样可以简单地用</font>Rake<font face="宋体, SimSun">命令来触发这个默认任务，在上面的</font>rakefile<font face="宋体, SimSun">中，我们可以用如下方式把&#8220;</font>today&#8221;<font face="宋体, SimSun">任务作为默认任务。</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font face="Courier New, monospace"><font style="font-size: 10pt;" size="2">task :default =&gt; [:today]</font></font></p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">然后调用直接在命令行中调用</font>rake<font face="宋体, SimSun">，可以得到跟调用</font>rake today<font face="宋体, SimSun">同样的输出结果。</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">这就是我们简单的一个</font>Rake<font face="宋体, SimSun">任务定义，下面是完整的修改后的</font>rakefile<font face="宋体, SimSun">：</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">task :default =&gt; [:today] <br />
<br />
desc "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">今天的任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
task :today do<br />
Rake::Task["home:cook"].invoke<br />
Rake::Task["home:laundry"].invoke<br />
end<br />
<br />
namespace :home do<br />
<br />
desc "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">1 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">买菜</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
task :purchaseVegetables do<br />
puts "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">到沃尔玛去买菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
end<br />
<br />
desc "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">2 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">做饭</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
task :cook =&gt; :purchaseVegetables do<br />
puts "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">做一顿香喷喷的饭菜。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
end<br />
<br />
desc "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">任务</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">3 -- </font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">洗衣服</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
task :laundry  do<br />
puts "</font></font><font face="宋体, SimSun"><font style="font-size: 10pt;" size="2">把所有衣服扔进洗衣机。</font></font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">"<br />
end<br />
end<br />
</font></font><br />
<br />
</p>
<h4>Rails<font face="宋体, SimSun">中的</font>Rake<font face="宋体, SimSun">任务</font></h4>
<p style="margin-bottom: 0.14in;" class="western">Rails<font face="宋体, SimSun">预定义了大量的</font>Rake<font face="宋体, SimSun">任务，在</font>Rails<font face="宋体, SimSun">应用的开发过程中，你想必已经在大量使用它们了。在</font>Rails<font face="宋体, SimSun">中，所有的</font>Rake<font face="宋体, SimSun">任务都放在</font>rails<font face="宋体, SimSun">目录的</font>lib/tasks<font face="宋体, SimSun">目录下（在作者的环境下是</font>c:"ruby"lib"ruby"gems"1.8"gems"rails-1.1.4"lib"tasks"<font face="宋体, SimSun">），所有的</font>rake<font face="宋体, SimSun">任务都以</font>.rake<font face="宋体, SimSun">作为后缀名，这些以</font>.rake<font face="宋体, SimSun">结尾的文件会被自动加载到你的环境中。你可以到一个已有的</font>Rails<font face="宋体, SimSun">工程根目录下键入</font>rake --tasks<font face="宋体, SimSun">，可以看到很多的</font>rake<font face="宋体, SimSun">任务已经为你整装待发了。</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">在</font>Rails<font face="宋体, SimSun">中，最常使用的</font>Rake<font face="宋体, SimSun">任务之一是进行数据库的迁移（</font>migration<font face="宋体, SimSun">）。数据库迁移程序允许你使用</font>Ruby<font face="宋体, SimSun">脚本来定义数据库模式，而</font>db:migrate<font face="宋体, SimSun">就是进行这个工作的</font>rake<font face="宋体, SimSun">任务。下面我们来分析这个</font>rake<font face="宋体, SimSun">任务。</font></p>
<p style="margin-bottom: 0.14in;" class="western"><strong>db:migrate</strong><font face="宋体, SimSun"><strong>任务</strong></font></p>
<p style="margin-bottom: 0.14in;" class="western">db:migrate<font face="宋体, SimSun">任务存放在</font>lib/tasks/databases.rake<font face="宋体, SimSun">文件中。这个文件中定义了所有与数据库操作相关的任务，我们仅仅抽出</font>db:migrate<font face="宋体, SimSun">的定义：</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">namespace :db do<br />
desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x"<br />
task :migrate =&gt; :environment do<br />
ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil) <br />
Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby<br />
end<br />
&#8230;&#8230;<br />
end</font></font></p>
<p style="margin-bottom: 0.14in;" class="western"><br />
<br />
</p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun"><strong>分析</strong></font></p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">首先是命名空间的声明，</font>migrate<font face="宋体, SimSun">任务的命名空间是</font>db<font face="宋体, SimSun">。这也就是我们用</font>db:migrate<font face="宋体, SimSun">来引用它的原因。</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">下面是一个描述，说明该任务的功能是把定义在</font>db/migrate<font face="宋体, SimSun">目录下（相对于你的</font>Rails<font face="宋体, SimSun">应用程序的根目录）的迁移脚本迁移到数据库中，如果不指定</font>VERSION<font face="宋体, SimSun">的话，默认是最新版本，否则可以恢复到一个指定的版本。</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">接着是任务的定义，该任务依赖于</font>enviroment<font face="宋体, SimSun">任务，这个任务在</font>misc.rake<font face="宋体, SimSun">中定义，用来加载</font>Rails<font face="宋体, SimSun">的环境，它的定义相当简单：</font></p>
<p style="margin-bottom: 0.14in;" class="western"><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">task :environment do<br />
require(File.join(RAILS_ROOT, 'config', 'environment')) <br />
end<br />
</font></font><br />
<br />
</p>
<p style="margin-bottom: 0.14in;" class="western"><font face="宋体, SimSun">用来加载</font>config/environment.rb<font face="宋体, SimSun">文件，该文件会加载</font>Rails<font face="宋体, SimSun">工作所需要加载的环境。由于加载了这个环境，所以</font>ActiveRecord<font face="宋体, SimSun">对象现在可以使用，下面就是调用</font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">ActiveRecord::Migrator.migrate</font></font><font face="宋体, SimSun">方法对每个</font>db/migrate/<font face="宋体, SimSun">下的脚本文件进行迁移。 </font> </p>
<font face="宋体, SimSun">最后会调用</font><font style="font-size: 10pt;" size="2"><font face="Courier New, monospace">db:schema:dump</font></font><font face="宋体, SimSun">任务，该任务的主要作用是产生</font>db/schema.rb<font face="宋体, SimSun">文件。该文件用来记录不同版本的数据库模式。这个任务的定义就在</font>db:migrate<font face="宋体, SimSun">任务下面不远的地方，有兴趣的读者可以自行进行分析。</font><br />
</span>
</span>
<img src ="http://www.blogjava.net/xan/aggbug/199533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-05-09 16:19 <a href="http://www.blogjava.net/xan/archive/2008/05/09/199533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>