- 浏览: 345100 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
springdata_spring:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
使用Maven管理Android项目(一) -
snowfigure:
snowfigure 写道我专门登陆上来,就是想问问,这个Ve ...
IntelliJ IDEA 生成注册码源程序 -
snowfigure:
我专门登陆上来,就是想问问,这个Version有啥鸟用?定义完 ...
IntelliJ IDEA 生成注册码源程序 -
非诚勿扰男嘉宾:
引用整个包就好了,不用具体类
androidannotations Eclipse下报引用不到框架生成类错误的解决方案 -
jf_emal:
至于大数据量时导致图表渲染慢的问题,可以通过改变业务逻辑及交互 ...
报表展示组件Highcharts与Fusioncharts的对比
原文:Ruby on Rails Rake Tutorial (aka. How rake turned me into an alcoholic)
引言:作为一个rails的开发者,你可能很熟悉使用rake进行你的测试,或者使用rake db:migrate运行你的migrations,但是你真的知道Rake的背后故事吗?你意识到可以自己写一个Rake任务或者一个有用的lib吗?
下面是我们使用Rake任务的例子:
1、给列表中的用户发送邮件
2、每晚数据的计算和报告
3、过期或重新生成缓存
4、备份数据和svn版本(how's this : subversion repository)
5、运行数据处理脚本(sort of,how much is called this )
6、Pouring drinks to get a good buzz on(一句玩笑,是这两位仁兄的风格)
这篇文章中,我们将讨论为什么要创建Rake,和他怎么样帮助我们的rails应用。最好你可以写自己的Rake。
一、历史回顾:make
为了了解Rake的来历,我们先了解一下Rake的爷爷:Make。
让我们回到那个代码块需要编译,解释性语言和iphone还没出现在地球上的时代。
回到那时,我们下载的大型程序,还是一堆源代码和一个shell脚本。这个shell脚本包含了所有需要用来compile/link/build的代码。你需要运行“install_me.sh”这个脚本,每一行代码将被运行(编译每一行源文件),然后生成一个你能够运行的文件。
对于大多数人这样是不错的,但是对于程序开发人员却是一个不幸。每次你对源代码进行一个小的改动,并进行测试的时候,你需要回到shell脚本,并重新编译所有的源代码,显然对于大的程序“那是相当的”耗时的。
1977年(作者出生那年,我78年),贝尔实验室的Stuart Feldman创造了“make”。解决了编译时间过长的问题。Make用来编译程序,取得两方面的进步:
Stuart Feldman
(1)Make可以发现哪个文件在上一次编译后改动过,根据这点,再次运行Make时,仅编译改动过的文件。这个很大程序上减少了重新编译大型程序的时间。
(2)Make可以进行从属跟踪。你可以告诉编译器,源文件A的编译需要源文件B,源文件B的编译需要源文件C,所以Make在编译A时发现B没有编译,将会先编译B。
可以这样定义:Make是一个可执行程序。像ls或dir一样。让Make理解如何让编译一个项目,需要创建一个makefile文件,描述所有的源文件和依赖关系。makefiles有自己的语法,你不用去了解。
这些年Make出现了其他的变体,并且被其他的语言使用。事实上,ruby用户在rake出现前也在使用它。
“但是,ruby并不需要编译,我们用它来干嘛?”
是啊。ruby是一个解释性语言,我们不需要编译它的源代码,所以ruby程序员为什么使用它呢?
两个重要的原因:
(1)创建任务
在大型的应用中,你经常编写脚本,在命令行下运行一些任务。比如清除缓存,维护任务,或者迁移数据库。你可以写一个MakeFile来组织你的任务,而不是写十个不相干的脚本(或者一个复杂的)。这样你可以简单的运行:“make stupid”。
(2)从属任务跟踪
当你开始写一些维护任务的时候,可能发现有些任务的使用可能有重复。比如,“migrate”任务和“schema:dump”都需要链接数据库,这样我可以创建一个任务"connect_to_database",使“migrate”和“schema:dump”都依赖于"connect_to_database",这样下次运行“migrate”时,"connect_to_database"会先于“migrate”运行
二、如何得到Rake
几年前,Jim Weirich在一个java项目上使用了Make,他发现如果在他的Makefile中写一小段ruby代码将会带来非常大的方便。所以他创建了Rake。
Jim 为Rake创建了任务功能,附属关系跟踪,甚至创建了时间段判断(timestamp recognition),(在上一次编译的基础上仅编译改动的部分),当然,对于ruby,我们并不需要编译。
我很想知道Jim在代码里做了什么,你也想知道吧。Jim可能从来没想给这个代码写个文档,可能现在他也是被烦透了,写了一个。呵呵
三、Rake如何工作
开始我想给这个部分起名为"How to get wasted with Rake"。
那么我想喝点酒,该怎么做呢?
1、去买酒
2、喝酒
3、喝醉
如果我要使用Rake完成这个任务,我会创建一个“Rakefile”文件:
task :purchaseAlcohol do puts "Purchased Vodka" end task :mixDrink do puts "Mixed Fuzzy Navel" end task :getSmashed do puts "Dood, everthing's blurry, can I halff noth'r drinnnk?" end
这样我可以在这个Rakefile的目录,分别运行这些任务:
$ rake purchaseAlcohol Purchased Vodka $ rake mixDrink Mixed Fuzzy Navel $ rake getSmashed Dood, everthing's blurry, can I halff noth'r drinnnk?
酷!但是从顺序上看,我可以用任何的顺序运行这个任务。比如喝醉在买酒或者喝酒之前。当然这不符合人的习惯。
四、Rake的顺序
task :purchaseAlcohol do puts "Purchased Vodka" end task :mixDrink => :purchaseAlcohol do puts "Mixed Fuzzy Navel" end task :getSmashed => :mixDrink do puts "Dood, everthing's blurry, can I halff noth'r drinnnk?" end
这样,如果想喝酒,就得先去买,如果想喝醉,就得先喝酒。
$ 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?
看到了吧,我喝醉和,因为酒已经买了,也被我喝了。(译者:我是喜欢百事的,所以倘若我写,定然拿百事当例子。但是我让我儿子和可口,为什么呢?下面告诉你。)
现在,你的欲望无法满足了,你想让你的朋友加入进来。就像一个团队的开发,如果你想加入一个新人,你得有合适的规划。你得有文档。那么问题来了。
五、如何给我的Rake添加文档
Rake添加文档非常的方便,使用“desc”就可以了:
desc "This task will purchase your Vodka" task :purchaseAlcohol do puts "Purchased Vodka" end desc "This task will mix a good cocktail" task :mixDrink => :purchaseAlcohol do puts "Mixed Fuzzy Navel" end desc "This task will drink one too many" task :getSmashed => :mixDrink do puts "Dood, everthing's blurry, can I halff noth'r drinnnk?" end
看到了吧,我的每个任务都添加了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任务的时候,你需要一个好方法将他们分类,这时用到了命名空间,如果我在上面的例子使用了命名空间,那么:
namespace :alcoholic do desc "This task will purchase your Vodka" task :purchaseAlcohol do puts "Purchased Vodka" end desc "This task will mix a good cocktail" task :mixDrink => :purchaseAlcohol do puts "Mixed Fuzzy Navel" end desc "This task will drink one too many" task :getSmashed => :mixDrink do puts "Dood, everthing's blurry, can I halff noth'r drinnnk?" end end
命名空间允许你将一些任务放到特定的分类中,在一个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创建几个文件夹:
desc "Create blank directories if they don't already exist" task(:create_directories) do # The folders I need to create shared_folders = ["icons","images","groups"] for folder in shared_folders # Check to see if it exists if File.exists?(folder) puts "#{folder} exists" else puts "#{folder} doesn't exist so we're creating" Dir.mkdir "#{folder}" end end end
当然,还可以在rake中使用更多的 文件工具File Utils,或者加入其他的部分。
八、如何为我的rails应用写一个Rake任务
一个rails应用中,已经有了一些rake任务,你可以在你的项目目录里运行:rake --tasks。
为了给你的rails应用添加一个新的任务,你可以打开/lib/tasks目录(已经存在的),添加一个叫something.rake的文件,这个任务会被自动的检索到,这些任务会被添加到rake tasks列表中,你可以在根目录里运行他们,现在把我们上面的例子放到这个rails应用中。
utils.rake
namespace :utils do desc "Create blank directories if they don't already exist" task(:create_directories) do # The folders I need to create shared_folders = ["icons","images","groups"] for folder in shared_folders # Check to see if it exists if File.exists?("#{RAILS_ROOT}/public/#{folder}") puts "#{RAILS_ROOT}/public/#{folder} exists" else puts "#{RAILS_ROOT}/public/#{folder} doesn't exist so we're creating" Dir.mkdir "#{RAILS_ROOT}/public/#{folder}" end end end end
注意上面的代码,我使用了#{RAILS_ROOT} 来得到rails应用的当前位置,现在运行“rake --tasks”,你可以看到我们的任务已经添加到tasks列表中了。
... rake tmp:pids:clear # Clears all files in tmp/pids rake tmp:sessions:clear # Clears all files in tmp/sessions rake tmp:sockets:clear # Clears all files in tmp/sockets rake utils:create_directories # Create blank directories if they don't already exist ...
九、如何在任务中调用rails的model
呵呵,这个正是我最多使用rake的地方,写一个rake任务,代替原来需要手工操作的地方,或者一些任务代替经常需要按照计划自动执行(使用 cronjobs)的事情。就像我开头说的那样我用rake任务执行下面的擦作:
1、给列表中的用户发送邮件
2、每晚数据的计算和报告
3、过期或重新生成缓存
4、备份数据和svn版本(how's this : subversion repository)
5、运行数据处理脚本(sort of,how much is called this )
这个补充了原来的功能,而且相当简单。下面这个任务是检查用户的过期时间,对快过期的用户发送邮件。
utils.rake
namespace :utils do desc "Finds soon to expire subscriptions and emails users" task(:send_expire_soon_emails => :environment) do # Find users to email for user in User.members_soon_to_expire puts "Emailing #{user.name}" UserNotifier.deliver_expire_soon_notification(user) end end end
使用你的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任务已经了解很多了,那么我将给你几个资源,我想最好的学习方法是看看别人的代码。
brand new rake tasks 在edge rails 中,这个可以创建和重置你的数据库。
Craig Ambrose写的数据库备份, database backups。
Adam Greene写了一组任务 set of Rake tasks,可以将所有的数据备份到amazon S3。他还给了我一个升级版本,你可以在这下载here。
Jay Fields的任务测试,testing rake tasks。
a new way of setting the RAILS_ENV and teaches how to use rake to boot you into a Mysql shell (看的时候留意一下他的注释)
Rake Bookshelf Books,和Martin Fowler的Using the Rake Build Language 教程,这两个都很有用,虽然有点过时。
发表评论
-
[转]ubuntu12.04搭建ruby on rails 环境
2012-05-14 10:28 1288经过几天的实验,终于 ... -
从JUnit到Rspec的尝试
2012-05-02 17:42 1575如今,各种测试框架层 ... -
rails走验证和不走验证方法汇总
2012-04-19 16:00 2010之前有一篇文章写到,在使用update_attribute方法 ... -
rvm实用指南(四)——切换ruby1.9.3报错
2012-04-18 22:11 725用RVM安装ruby后,运行ruby 1.9.3 ... -
rvm实用指南(三)——安装ruby1.9.3报错
2012-04-17 15:52 1503今天在用rvm install 1.9.3时,报了些莫 ... -
rails中单独更新某一属性,不走model层的validate
2012-04-10 17:18 1539在做Rspec测试时,有一用例如下 desc ... -
ruby--Hash方法汇总(转)
2012-03-27 16:53 1452一。给Hash添加默认值 : Ruby代码 ... -
Rails中数据库查询分组的几种方式
2012-03-06 11:47 1802方式一: ruby代码方式: machine_group ... -
推荐 Gem 列表(转)
2012-02-20 16:20 668详情请见: http://ruby-china.org/wik ... -
搭建redmine过程中遇到的问题
2012-02-06 16:13 1332最近想搭建一下redmine,好学习一下这个开源源码。 但 ... -
安装特定版本的rails
2012-02-03 11:52 790gem install rails --version=< ... -
rvm实用指南(二)(转)
2012-02-03 11:48 1426RVM简介 Ruby Version Manager,Ru ... -
rvm实用指南(一)(转)
2012-02-02 21:07 1041rvm是一个命令行工具,可以提供一个便捷的多版本r ... -
rails中怎么把小数取成两位的小数(四舍五入)?
2011-10-10 13:07 165922.1231234.round(2) (" ... -
Ubuntu下bundle install报错
2011-09-28 15:56 3855Ubuntu下bundle install命令报错 / ... -
Ubuntu下rvm使用的几个命令
2011-09-28 15:32 888在删除bundler gem包时出现错误,解决措施如下: ... -
Rails读写分离实现
2011-08-30 11:17 1889报表组件读写分离实现 由于Kelude数据量不断增大 ... -
ruby on rails如何将时间段换算成天数
2011-08-25 11:23 1858#将时间点做差,并转换成天数 time = (" ... -
.nil? , .empty?, .blank? .present? 的区别(转)
2011-08-23 20:46 848首先这三个都是判空的。 而 .nil? 和 .empty? ... -
由表及里解析Rails路由(转)
2011-07-14 21:53 1259转自 http://hlee.iteye.com/bl ...
相关推荐
本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习Rails的宝贵资源,帮助初学者快速掌握这个强大的框架。 1. **Rails基础知识**: - MVC架构:Rails的核心设计模式,模型负责数据处理,视图负责展示,控制器...
**描述解析:**“台湾朋友写的ruby on rails教程”表明此教程由台湾地区作者撰写,这可能意味着文档中会使用简体中文,并且可能包含针对中文环境或台湾地区特定需求的指导建议。 #### 环境准备:跨平台安装与配置 ...
在Ruby on Rails中,"模型"负责处理数据和业务逻辑,"视图"负责展示数据,而"控制器"则作为模型和视图之间的桥梁,处理用户请求并调用模型方法来更新数据,再将结果传递给视图进行渲染。Rails提供了许多内置的便利...
通过学习和实践本光盘中的源代码,你可以逐步掌握Ruby on Rails的开发技巧,理解Web应用的生命周期,从而提升你的Web开发能力。记得结合书籍中的理论知识,与源代码相结合,理论联系实际,这样才能更好地吸收和运用...
### Ruby on Rails 手动安装知识点详解 #### 核心概念与背景 **Ruby on Rails**,简称**Rails**,是一种使用**Ruby**语言编写的开源全栈Web应用框架,遵循MVC(Model-View-Controller)架构模式,强调代码效率与...
Ruby on Rails,简称Rails,是由David Heinemeier Hansson基于Ruby语言开发的一个开源Web应用程序框架,它遵循敏捷开发的理念,致力于提高开发效率和代码的可读性。在Rails 3.1版本中,引入了许多重要更新和改进,...
### Ruby on Rails基础知识详解 #### 一、Rails简介与安装 **Rails** 是一款流行的开源Web应用框架,基于Ruby语言编写。它强调简洁性、生产力和优雅的设计,非常适合快速开发Web应用。 - **特点** - **DRY (Don'...
**Ruby on Rails 开发环境构建:Eclipse与RadRails 插件详解** 在现代软件开发领域,Ruby on Rails(简称Rails)作为一个强大的Web应用程序框架,因其简洁、高效的特性深受开发者喜爱。而Eclipse,作为一款功能强大...
这个压缩包文件集合包含了关于Ruby on Rails的多个资料,包括可能的英文教程和中文教程,为学习和深入理解RoR提供了一站式资源。 RoR的核心理念是“约定优于配置”(Convention over Configuration, CoC),这意味...
Ruby on Rails 是一个基于Ruby语言的开源Web应用...在实际操作过程中,可能会遇到各种问题,但只要遵循Ruby on Rails的开发习惯和Redmine的文档指示,都能找到解决办法。记住,不断学习和实践是成为IT行业大师的关键。
### 基于Ruby语言的Ruby on Rails项目及其代码方案 #### 一、项目概述 本项目基于Ruby语言,利用Ruby on Rails(简称Rails)框架构建。Ruby on Rails是一款使用Ruby语言开发的应用程序框架,其核心是MVC(Model-...
Ruby on Rails,简称Rails,是基于Ruby编程语言的一个开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和可读性,同时强调“约定优于配置”的原则。在本实例开发中,我们将探讨如何...
在Ruby on Rails中,MVC模式的三个主要组件各有其职责: - Model(模型)负责与数据库交互,管理数据的存取和业务逻辑处理。 - View(视图)负责展示数据给用户,即应用程序的用户界面。 - Controller(控制器)负责...
Ruby on Rails,简称Rails,是基于Ruby语言的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发更简洁、高效。Rails强调“约定优于配置”,大大减少了开发者在项目设置上的工作...
在这个“Ruby on Rails博客程序”中,我们将深入探讨如何在Ubuntu 11.10操作系统上,使用Rails 3.0.8版本构建一个简单的博客平台。 首先,我们要了解Rails的基本概念。MVC架构将应用分为三个主要部分:模型(Model...
在"Ruby on Rails入门例子"中,你可能会学习如何创建一个简单的Rails应用。首先,你需要安装Ruby和Rails环境,然后使用`rails new`命令生成一个新的项目。接下来,会介绍如何创建控制器、模型和视图。例如,创建一个...
在Ubuntu 11.04环境中,安装MySQL数据库是部署Ruby on Rails应用的重要步骤之一。首先,通过打开终端并执行以下命令进行安装: ```bash sudo apt-get install mysql-server ``` 在安装过程中,系统会提示输入MySQL...
在Ruby on Rails框架中,数据库配置是至关重要的部分,它允许开发者与各种数据库系统进行交互,如MySQL、Microsoft SQL Server等。以下将详细介绍如何在Windows环境下安装Ruby on Rails以及配置数据库。 首先,我们...
Oracle是一种流行的关系型数据库管理系统,而Ruby on Rails(简称RoR)则是一个基于Ruby语言的开源Web应用框架,它以其MVC(模型-视图-控制器)架构模式和“约定优于配置”的原则受到开发者们的青睐。本文将探讨如何...