- 浏览: 98418 次
- 性别:
- 来自: 上海
最新评论
-
lgtq1983:
很清晰,多谢楼主整理
linux 环境变量 -
lythemaster:
不错,学习了,讲的很有条理~
linux 环境变量 -
yangzhihuan:
留个名,有机会参考一下.
Ruby + Apache+ mod_fcigd 配置笔记 -
qianjigui:
不错,终于找到解决方案了.谢谢!
ActionController::InvalidAuthenticityToken异常 解决办法 -
小小龙猫:
是的,可以的,不过那样的话就全部disable了,这样只适合在 ...
ActionController::InvalidAuthenticityToken异常 解决办法
作为一个Rails开发者,你可能熟练得运用“rake”运行你的测试,或者你利用“rake db:migrate”运行你的数据迁移任务(migration)。但是,你是否真正明白在那些Rake任务的背后发生了什么吗?你是否意识到,你可以 编写属于你的任务,或者创建好用的属于你的Rake库文件?
下面是我运用Rake任务的一些例子:
- 创建一个成员列表,并给他们发送电子邮件。
- 进行每天的数据计算和报告。
- 清除过期和重新创建缓存。
- 数据库备份和subversion repository。
- 运行任何类型的数据操作脚本。
- 为即将开始我们的谈话倒酒(玩笑)
在这篇文章中,我们将理解为什么Rake被发明,以及它如何协助我们的Rails应用程序。最终你将能够编写属于你的任务。
内容列表
- 回顾:为什么是make?
- 如何获取Rake?
- Rake如何工作?
- 如何表达rake依赖?
- 如何为Rake任务写文档?
- Rake命名空间
- 如何写有用的Ruby任务?
- 如何为我的Rails应用写Rake任务?
- 可以在任务中访问Rails模型(Model)吗?
- 哪里可以找到更多的例子?
回顾:为什么是make?
为了理解我们为什么拥有Rake,我们首先需要注目一下Rake的祖父Make。
和我回忆一下过去,在解释性语言和iPhones诞生之前,每一段代码都需要编译。
那时候如果你下载大型程序,它们总是伴随着大量源代码和一个shell 脚本。 这个脚本包含你的计算机为了编译/链接/创建应用程序,需要的每一行代码。你必须运行“install_me.sh”(shell脚本),每一行代码将运 行(编译每一个源文件),然后编译出可执行文件。
对大多数人来说,此过程工作正常,除非你是开发程序的所有人中极其不幸运的一个。每一次你对源代码做了很小改动,并且想测试它,你必须重新运行shell脚本来重新编译所有代码。显然,如果是大型程序这将消耗大量时间。
- Make 识别那些文件/资源在最后一次编译被改动。利用这个信息,Make在第二次执行的时候,只编译被改动过的源文件。这动态地减少了重新编译大型程序的时间。
- Make也包含依赖跟踪(dependency tracking),所以你可以告诉编译器,源文件A需要源文件B来正确编译,源文件B依赖源文件C来正确编译。因此,如果Make编译源文件A而源文件B尚未编译,那么,系统将首先编译源文件B。
也可以这样解释,“Make”是一个简单的可执行程序,像“dir”或“ls”一样。为了让Make如何知道编译一个程序,必须创建一个“makefile”文件,它描述所有的源文件和依赖关系。
经过多年的发展,其它编程语言甚至开始运用Make。事实上,许多Ruby编程人员在rake出来之前一直运用它。
“但是,Ruby不需要被编译,所以为什么Ruby程序员使用它?”你如此叫道。
是的,Ruby是一个解释性的语言,我们不需要编译我们的代码,那么为什么Ruby程序员使用Make文件呢?
好吧,有两个主要原因:
- 创建任务—在每一个大型程序最后,你都要编写命令行下可以运行的脚本。或许你想清除缓存,运行一个维护任务, 或者迁移数据库。除吧创建10个单独的shell脚本(或者一个大型的复杂脚本),你可以创建单个“Makefile”文件,在其中你可以通过任务组织所 有的东西。然后任务可以通过键入“make stupid”来运行。
- 依赖任务跟踪—当你开始编写维护任务的库的时候,你开始注意到某些任务可能部分重复。例如,任务 “migrate”和任务“schema:dump”都需要连接一个数据库。我可以创建叫“connect_to_database”一个任务,让任务 “migrate”和任务“schema:dump”都依赖于“connect_to_database”下次我运行“migrate”,在 “migrate”运行之前“connect_to_database”将被运行。
如何获取Rake?
不少年以前Jim Weirich 工作在一个使用Make的Java项目。当使用他的Makefile,他意识到,在他的Makefile中,如果他能够编写小的Ruby代码片段,事情会 变得异常方便。所以他创造了rake。上个月在Railsconf会议,我们幸运的见到了Jim,他的确是个不错的人。
Jim加入了创建任务功能,进行任务依赖跟踪,甚至加入同样时间戳识别。(只构建最后一次编译被改动的源文件)。显然,最后一个特性不是我们在Ruby中经常用到的。因为我们不需要编译。
我一直惊奇“Jim Weirich”所做的一切,现在你也知道了!Jim从来没有特意的编写Make,我猜想他只是不得以写出来的。
Rake如何工作?
起初,我想给这部分加个“如何因Rake变得挥霍”的标题,但是,不是很直觉得那么做。
假设我想喝醉,需要那几个步骤?
- 买酒
- 喝酒
- 喝醉
如果我想运用Rake来调用以上的任务,可以创建一个包含以下内容的“Rakefile”文件:
1 |
task :purchaseAlcohol do |
然后我在rake文件的同一个目录下运行每一个任务,有一点如下所示:
$ rake purchaseAlcohol
Purchased Vodka
$ rake mixDrink
Mixed Fuzzy Navel
$ rake getSmashed
Dood, everthing's blurry, can I halff noth'r drinnnk?
相当酷!不管怎样,从依赖的立场,我可以任何顺序运行任务。虽然有时候,我希望在“mixDrink”或者“purchaseAlcohol”之前,我可以“getSmashed”,这不是简单人力所能及。
如何表达rake依赖?
1 |
task :purchaseAlcohol do |
所以,现在我说“为了mixDrink,我必须先purchaseAlcohol”,“为了getSmashed 我必须mixDrink”。也许如你希望,依赖堆叠,因此:
$ rake purchaseAlcohol
Purchased Vodka
$ rake mixDrink
Purchased Vodka
Mixed Fuzzy Navel
$ rake getSmashed
Purchased Vodka
Mixed Fuzzy Navel
Dood, everthing's blurry, can I halff noth'r drinnnk?
正如你所看到的,现在当我将要“getSmashed”,依赖的任务“purchaseAlcohol”和“mixDrink”被调用。
经过不久,你可能被诱惑不断膨胀你的酒瘾,因此而扩充你的Rakefile文件。你也许会是你的朋友染上酒瘾。正像一个真正的软件项目,当你的团队增加成员的时候,你需要保证你有良好的文档。问题成了:
如何为rake任务写文档?
Rake提供了一个简洁的方法来为task编写文档,下面是用法示例:
1 |
desc "This task will purchase your Vodka" |
正如你所看到的,每一个任务有一个“desc”。这允许我们和朋友键入“rake -T”或者“rake –tasks”
$rake --tasks
rake getSmashed # This task will drink one too many
rake mixDrink # This task will mix a good cocktail
rake purchaseAlcohol # This task will purchase your Vodka
很简单吧?
Rake命名空间
一旦你成为一个酒徒,并且使用大量的Rake任务,你可能需要一个好一点的办法对他们加以分类。这是为什么使用命名空间的原因。如果我在上面的例子使用命名空间,它看起来将是这样:
1 |
namespace :alcoholic do |
命名空间允许你根据分类为任务分组,是的,你可以在一个Rakefile中拥有多个命名空间。现在,如果我执行“rake –tasks”,我将看到:
rake alcoholic:getSmashed # This task will drink one too many
rake alcoholic:mixDrink # This task will mix a good cocktail
rake alcoholic:purchaseAlcohol # This task will purchase your Vodka
所以,现在运行以上任务,显然你将运行“rake alcoholic:getSmashed”
如何写有用的Ruby任务?
好了,你尽管写ruby代码就可以了。不是开玩笑。最近,我需要一个创建几个目录的脚本,所以我最终编写了一个Rake任务,如下:
1 |
desc "Create blank directories if they don't already exist" |
默认情况下,rake可以访问File Utils里的任何东西,但是你可以包含任何额外的Ruby中的任何东西。
如何为我的Rails应用写Rake任务?
Rails应用程序附带着许多预先存在的rake任务,你可以进入应用程序目录下键入“rake –tasks”来显示这些任务。如果你还没有尝试,马上尝试,我会等待….
为你的Rails应用创建新的rake任务,你需要打开/lib/tasks目录(目录必须已经存在)。在这个目录中,如果你创建属于你的 Rakefile,并且命名为“something.rake”,任务将自动被接受。任务将被增加到应用程序rake任务的列表中,你可以从应用程序的根 目录运行他们。让我们吧上面的例子,应用到我们的rails应用程序。
utils.tasks
1 |
namespace :utils do |
注意,在代码片断中,我是如何使用#{RAILS_ROOT}来得到全路径的。如果我现在我应用程序的根目录下,运行“rake –tasks”,我将看到这个新功能将和其它rails rake任务混合在一起。
1 |
... |
很酷!现在,此处它变得比较有用。
可以在任务中访问Rails模型(Model)吗?
当然!事实上这正是我们使用rake的主要用途:编写偶尔需要手动运行的任务,或者定时调度以自动运行的任务(使用cronjobs)。正如我在文章开始说的,我使用Rake任务来做下面的事情:
- 创建一个成员列表,并给他们发送电子邮件。
- 进行每天的数据计算和报告。
- 清除过期和重新创建缓存。
- 数据库备份和subversion repository。
- 运行任何类型的数据操作脚本。
非常有用,而且简单。下面是一个查找订购关系即将过期用户、并发送电子邮件的的rake任务。
utils.tasks
1 |
namespace :utils do |
正如你看到的,只有一个步骤访问你的模型(model),“=> :environment”:
- task(:send_expire_soon_emails => :environment) do
在你的开发数据库上,运行这个任务,我将运行“rake utils:send_expire_soon_emails”。如果我想在产品数据库上运行,我将运行“rake RAILS_ENV=production utils:send_expire_soon_emails”。
如果我想每天午夜,在产品数据库上运行此任务,我将编写一个如下cronjob:
0 0 * * * cd /var/www/apps/rails_app/
&& /usr/local/bin/rake RAILS_ENV=production utils:send_expire_soon_emails
相当简便!
哪里可以找到更多的例子?
既然你已经知道如何开始编写rake任务,我想我应该给你一些资源。改善你编程最好的方法是阅读他人的代码,一些人们已经些好的rake任务。
- 这些Edge Rails中的全新rake任务帮助你创建、重置你的数据库。.
- Craig Ambrose写了一个Rake任务来备份数据库,你可以使用。
- Adam Greene把一些Rake任务放在一起,允许你备份你的数据到Amazon S3。他给我发送那些库的更新版本,你可以在这里下载。
- Jay Fields讨论了rake任务测试,因此获得好评。
- Err the blog 讨论了关于设置RAILS ENV的新方法,并且教授如何运用rake来启动Mysql shell(当你浏览的时候,确保阅读注释)。
- 最后的但同等主要的,有Rake Bookshelf Books和Martin Fowler的Using the Rake Build Language教程。它们都很完备,但也有一点过时。
如果你找到了其它比较好的,发贴子给我们。
追加
作为追加,我几分钟以前受到Jim的电子邮件,解释我如何可以简化我的目录创建脚本,相当酷:
1 |
# This is needed because the existing version of |
发表评论
-
rails 下生成 sitemap
2010-08-07 13:48 1503google了一下,找了一个sitemap 的插件,还比较好用 ... -
watir 1.6.5 不能set 中文问题
2010-04-27 14:52 2030转贴,具体谁写的已经不知道了,还是要谢谢一下 在一阵子 ... -
rails console
2010-04-07 11:17 0使用 rails3 的 console 可以提高工作效率,有的 ... -
Ruby + Apache+ mod_fcigd 配置笔记
2008-09-22 16:12 2179因为公司不想用别的WEB服务器,所以只能把 ... -
ActionController::InvalidAuthenticityToken异常 解决办法
2008-06-30 16:01 3503ActionController::InvalidAuthen ... -
读《programming ruby》笔记 四 Blocks Iterators
2008-04-06 15:09 1585这两个月比较忙,没有时间更新BLOG,今天开始继续。 ruby ... -
读《programming ruby》笔记 三 Class Objects Variables
2008-01-29 11:14 1188定义一个类用 Class ,类名一般以大写开头。每个类 ... -
读《programming ruby》笔记 二 Numbers Ranges
2008-01-23 16:39 1002Ruby 支持Integer和浮点型数字类型,在Ruby中I ... -
读《programming ruby》笔记 一 String
2008-01-22 10:34 1239学习了一段时间的Ruby on Rails,用它做了一些小东 ... -
在rjs里填充select 的options
2007-10-26 11:40 425网上一般都说是用render的方法,不过那样需要一个templ ... -
link_to_remote 如何通过 javascript传值的问题
2007-10-25 14:12 2926今天遇到一个问题,当用到link_to_remote的时候想把 ... -
读取RSS的问题
2007-10-24 18:12 1203我用rss =RSS::Parser.parse(conten ...
相关推荐
Rake简介 Rake的意思是Ruby Make,一个用ruby开发的代码构建工具. 但是,为什么Ruby需要Rake? 按理说Ruby代码无需编译,应该不需要Rake才对呀?原来,Rake另有妙用,即把Rake当做一个任务管理工具来使用…这样做有两个...
11. **Ruby-Rake简介**:Rake是Ruby的构建工具,类似于Java的Ant或Python的setup.py,用于编写构建任务,如运行测试、清理、生成文档等。它基于Ruby编写,使得任务定义更加灵活。 12. **ruby1.8 1.9问题**:Ruby ...
Rake接收技术简介** Rake接收技术是一种针对多径衰落的分集接收策略。它通过识别和接收来自不同路径的信号,进行相位校准和合并,从而减少多径干扰对信号的影响。在3G通信中,由于采用宽频带扩频通信技术,多径...
【CDMA2000简介】 CDMA2000是码分多址(Code Division Multiple Access)技术的一种3G移动通信标准,由IS-95系统发展而来,主要在美国和韩国等地广泛应用。该标准旨在提供高速数据传输服务,通过直接序列扩频和多...
**Rust语言简介** Rust是一门系统级编程语言,由Mozilla研发,设计目标是安全性、速度和并发性。Rust语法简洁明了,具有严格的类型检查和所有权模型,确保了内存安全,同时其高性能和低级别的控制能力使其成为构建...
`rake`简介 `rake`是Ruby的Make-like程序,由Jim Weirich创建,它基于Ruby语言,因此具有更好的灵活性和可扩展性。与`make`相比,`rake`的任务定义更加直观,因为它们是用Ruby代码编写的。这使得`rake`任务可以...
(5)具有上下行信道互惠性,能够更好的采用传输预处理技术,如预RAKE技术、联合传输(JT)技术、智能天线技术等,能有效地降低移动终端的处理复杂性。 四、TD-LTE系统特有技术 LTE系统同时定义了FDD和TDD两种双工...
LTE TDD 和 LTE FDD 技术简介和比较 LTE(Long Term Evolution)是 UTRA(Universal Terrestrial Radio Access)的一种长期演进技术,以实现更高的数据速率、更短的时延、更低的成本、更高的系统容量和改进的覆盖...
【Hadoop简介】 Hadoop是Apache软件基金会开发的一个开源分布式计算框架,主要处理海量数据的存储和计算。它源于Google的MapReduce论文和GFS文件系统模型,旨在提供高容错性、高可扩展性和高效的数据处理能力。...
5. **多址接入协议**:介绍如RAKE接收、软切换和更软切换等多址接入技术,提升通信的可靠性和效率。 6. **3G演进**:详细讲解WCDMA的发展,包括HSDPA(High Speed Downlink Packet Access)和HSUPA(High Speed ...
RAKE 接收技术是指在CDMA系统中,使用多个天线来提高通信系统的可靠性和容量。RAKE 接收技术可以分为两类:天线分集和信道分集。 5. 新一代移动通信核心技术 MIMO+OFDM 简介: MIMO(Multiple Input Multiple ...
简介 ruby-wbem 在 ruby-sfcc (CIM/XML) 和 openwsman (WS-Management) 之上提供了一个抽象层 您可以使用它连接到任何 CIMOM 对话 CIM-XML 或 WS-Management 要求 Ruby解释器 ruby-wbem 已经构建,测试套件...
- `README.md`:可能包含项目简介、安装和使用指南。 综上所述,这个项目是一个基于Ruby on Rails框架构建的拉脱维亚房地产市场分析工具的着陆页,使用HTML、CSS和JavaScript创建用户界面,并通过rake命令进行开发...
FFI-libfreenect 用于 OpenKinect libfreenect 库的基于 FFI 的 Ruby 包装器。 要求 * ffi >= 0.5.0 ...安装 确保在开始之前正确安装了 libfreenect...rake install 简介¶ ↑ require 'freenect' ctx = Freenect .
简介 ruby-sfcc 为 ruby 提供了 SBLIM 客户端 API ( )。 您可以使用它来连接到任何 CIMOM 的 CIM-XML,但它可以通过使用本机接口进行连接来利用 sfcb CIMOM。 要求 Ruby解释器 ruby-sfcc 已经构建,测试套件...
#### 一、Redmine 简介 Redmine 是一个开源的、跨平台的项目管理和缺陷追踪工具,它可以帮助团队更好地组织和跟踪项目进展。Redmine 支持多项目管理、时间追踪、文件版本控制、任务分配等功能,并且可以通过插件扩展...
#### 一、Ruby on Rails简介 Ruby on Rails(简称Rails或RoR)是一种使用Ruby语言编写的开源全栈Web应用框架。它遵循模型-视图-控制器(MVC)架构模式,强调代码优雅性和开发效率,通过约定优于配置的理念简化了...
**2.1 RAKE接收机简介** - **RAKE接收机**:一种利用多径信号提高接收性能的技术,特别适用于WCDMA等码分多址系统。 - **工作原理**:通过分离不同到达时间的信号,并将其合并来提高接收信号的质量。 **2.2 WCDMA...
第一章概述 1 ...8.1 IS-95 标准及Q-CDMA系统简介 93 8.1.1 IS-95 标准CDMA空中接口标准 93 8.1.2 Q-CDMA 系统的信号设计 94 8.1.3 - CDMA 系统的功率控制 98 8.1.4 Q-CDMA 系统的其它几项关键技术 100