- 浏览: 163963 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
GunChin:
有些复杂,看得不是很懂
RAILS -
shellfish:
恩,红帽默认的SELinux的级别是强制,这个一般我不大用,装 ...
华思服务器一个奇怪问题的解决方法 -
机器人:
你说得太好了了了了了了了 子 啊啊啊啊,呼啦啦。
GIT handbook -
hbxiao135:
能介绍下 fat free crm的 流程分析吗?
(CRM)customer relationship management sysetm
原文:
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 Weirich
,中:
Jason Seifer
,右:
Gregg Pollack
(后面两位为本文作者)
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
教程,这两个都很有用,虽然有点过时。
如果你发现其他更好的文章,发贴子给我们。
译者:恩,这段不用翻译,懂的朋友自然会去看的了。
Still reading? If you are, I wanted to let you know that we're looking for more
people to write for RailsEnvy. If you have an idea for a good rails tutorial we
want to hear from you! Basically we would work with you to flesh out the
tutorial and help polish (acting as an editor). It could definitely be a great
way to get your name out there, and start getting some hits (for your blog or
company). Email Gregg at RailsEnvy if you're interested.
另:我刚收到
jim
的邮件,如何更简单的创建我的目录。
# This is needed because the existing
version of directory in Rake is slightly broken, but Jim says it'll be fixed in
the next version.
alias :original_directory :directory
def directory(dir)
original_directory dir
Rake::Task[dir]
end
# Do the directory creation
namespace :utils do
task :create_directories => [
directory('public/icons'),
directory('public/images'),
directory('public/groups'),
]
end
发表评论
-
actionmailer发送邮件失败的问题解决记录
2011-05-24 14:12 2334我们公司的WLAN网管采用ruby on rails架构,同时 ... -
控制器内部对请求的操作
2009-10-20 13:41 1843控制器内部对请求的操作 一Action方法 1 ... -
在rails环境中直接执行sql语句而不需要创建MODEL
2009-09-23 10:54 2987标准格式是:ActiveRecord::Base.connec ... -
6 Steps To Refactoring Rails (for Mere Mortals)
2009-07-31 11:26 866Since December, Rails ... -
rails 中简单的创建保存一条信息
2009-07-20 09:43 717Securitylog.new( # :ses ... -
uninstall all gems
2009-07-14 11:31 876GEMS=`gem list --no-versions` ... -
rails 拖拉排序效果demo
2009-06-30 10:55 1353要為Ruby on Rails程式加入拖曳排 ... -
something about with_scope
2009-06-23 10:53 1164今天看了一点关于with_scope的知识,有点感觉,写点东西 ... -
Add jQuery datagrids to your Rails applications
2009-06-03 10:39 1521Add jQuery datagrids to your Ra ... -
Multiple Attachments in Rails
2009-06-03 10:19 1822Multiple Attachments in Rails ... -
REST on Rails之自定义路由
2009-06-03 10:03 1686REST on Rails之自定义路由 from L ... -
自定义will_paginage输出
2009-06-03 09:55 787自定义will_paginage输出 from Le ... -
Rails Cookie测试
2009-06-03 09:48 1077Rails Cookie测试 from Le ... -
配置ActionMailer使用GMail发送邮件
2009-06-03 09:45 1455配置ActionMailer使用GMail发送邮件 ... -
rails 记住跳转前的url
2009-06-02 13:44 1382def store_location ses ... -
给Non-ActiveRecord Objects进行validate
2009-06-02 09:33 887对于非ActiveRecord对象的Validation,我们 ... -
file_column简单的照片上传
2009-04-21 18:19 9671.file_column git clone git:/ ... -
cookie + js动态修改iframe 父窗口的链接参数
2009-04-21 18:12 2870取得 由于最近自己做的项目中采用了目前较为流行的经典左右结构 ... -
git 冲突解决
2009-04-21 17:57 5169比较笨的办法就是直接改本地的代码 先git pull ,他 ... -
git 下gw来查看团队的修改
2009-04-07 15:46 856首先开启一个命令行,在命令行中输入 alias gw= ...
相关推荐
在Ruby on Rails(ROR)开发环境中,安装和配置正确的依赖包是至关重要的。这个压缩包包含了一系列用于ROR框架的基础组件,但不包括Ruby本身。让我们深入了解一下这些包的作用和重要性。 首先,`actionpack`是Rails...
"ror留言板程序"是一个基于Ruby on Rails框架开发的简单应用,它主要用于实现用户在网站上留言和查看他人留言的功能。Ruby on Rails(简称RoR)是用Ruby语言编写的开源Web应用程序框架,遵循MVC(Model-View-...
在Rails中,这通常是通过运行`rake db:migrate`命令完成的,它会根据模型定义创建或更新数据库结构。 **创建控制器** 接着,你需要创建一个控制器来处理博客的HTTP请求。在RoR中,控制器负责协调模型和视图。可以...
设置在终端上运行以下命令以设置此项目“ rvm使用2.7.0@ror-apis --create”创建gemset。“捆绑安装”以安装所有软件包。“ rake db:create”创建数据库。“ rake db:migrate”运行所有迁移。“ rake db:seed”...
我的管理员 Ruby on Rails的管理员 安装MyAdmin 添加到您的GemFile中: gem 'my_admin' 运行“ bundle”命令更新Gemfile.lock。... 运行“ rake db:migration”以创建MyAdmin表。 启动您的“ rail
Rake工具则提供了任务自动化,可以执行数据库迁移、构建或者清理任务。 Ruby on Rails的社区非常活跃,拥有丰富的插件和gem(Ruby的库包),如Devise用于身份验证,CanCanCan进行权限管理,Carrierwave或Paperclip...
自述 此自述文件通常会记录启动和运行应用程序所需的任何步骤。 您可能想要涵盖的内容: Ruby版 系统依赖 配置 数据库创建 数据库初始化 ... 如果您不打算运行rake doc:app请随意使用不同的标记语言。
在终端中,转到项目目录的根目录。 运行bundle install 。 运行rake db:create 。 运行rake db:migrate 。 运行rake db:seed 。 运行rails server 。 使用浏览器,转到http://localhost:3000 。
Ridgepole-rails提供了两个Rake任务: ridgepole:export和ridgepole:apply它们分别包装的ridgepole --export和ridgepole --apply 。 用法 要将数据库的当前架构导出到Schemafile rake ridgepole:export 将Schema...
使用 Ruby on Rails 学习测试驱动开发 设置 按照设置 Ruby on Rails 克隆这个 repo mkdir ~/workspace ... bundle exec rake db:create db:migrate 运行测试并按照说明进行操作 bundle exec rspec 享受!
自述 此自述文件通常会记录启动和运行应用程序所需的任何步骤。 您可能想要涵盖的内容: Ruby版 系统依赖 配置 数据库创建 数据库初始化 ... 如果您不打算运行rake doc:app请随意使用不同的标记语言。
bundle exec rake db:setup 先决条件 图形魔术师 brew install graphicsmagick PostgreSQL brew install postgresql nodejs和yarn brew install node brew install yarn 启动应用 首次运行时设置数据库 rake db:...
Redmine是一个使用Ruby on Rails(简称RoR)框架建立的灵活的项目管理工具。它提供了基本的需求管理、缺陷管理功能,还提供了新闻发布、Wiki、论坛等其他功能。下面详细介绍了在Windows平台上安装Redmine的步骤: ...
自述 此自述文件通常会记录启动和运行应用程序所需的任何步骤。 您可能想要涵盖的内容: Ruby版 系统依赖 配置 数据库创建 数据库初始化 ... 如果您不打算运行rake doc:app请随意使用不同的标记语言。
自述文件 git clone :afaraldo / system-api.git捆绑安装rake db:create rake db:migrate rake db:seed cd前端npm安装 或 sudo docker-compose up --build 演示: :
自述文件 此自述文件通常会记录启动和运行应用程序所需的任何步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 数据库初始化 ... 如果您不打算运行rake doc:app请随意使用其他标记语言。
自述 此自述文件通常会记录启动和运行应用程序所需的任何步骤。 您可能想要涵盖的内容: Ruby版 系统依赖 配置 数据库创建 数据库初始化 ... 如果您不打算运行rake doc:app请随意使用不同的标记语言。
自述文件-更新了 上海 该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 ... 如果您不打算运行rake doc:app请随意使用其他标记语言。
您可能要讲的内容: Ruby版本系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列,缓存服务器,搜索引擎等) 部署说明… 如果您不打算运行rake doc:app请随意使用其他标记语言。
这是RestApi的Rails测试...-write ' **/*.rb '注释(用于模型和路线的信息生成器) rails g annotate:installrake annotate_models # Add schema information (as comments) to model and fixture filesrake annotate