简介
简单而言,Rake是一个由ruby编写的build工具。
DSL
Rake是由ruby实现的,它的rakefile完全是由ruby语法定义的,所以它是一种内部DSL--基于另一种语言(宿主语言)编写的DSL。
Dependency Based Programming
Rake跟ant和make一样,是一种Dependency Based Programming。
Dependency Based Programming是一种基于依赖的编程方法,它的一条原则是依赖链中的任何任务只执行一次。
task :codeGen do
# do the code generation
end
task :compile => :codeGen do
#do the compilation
end
task :dataLoad => :codeGen do
# load the test data
end
task :test => [:compile, :dataLoad] do
# run the tests
end
在上面这个例子中,test依赖于compile和dataLoad两个task,而compile和dataLoad都分别依赖于codeGen。当执行test这个task的时候,首先会执行codeGen(但只是一次),再执行compile和dataLoad(执行的顺序跟定义顺序无关)。
Task
Rake的task主要分类为regular task和file task两类。
Regular task类似于ant中的task,而file task类似于make中的task。
上面那个例子就是regular task,再让我们来看一下file task的例子:
file 'main.o' => ["main.c", "greet.h"] do
sh "cc -c -o main.o main.c"
end
file 'greet.o' => ['greet.c'] do
sh "cc -c -o greet.o greet.c"
end
file "hello" => ["main.o", "greet.o"] do
sh "cc -o hello main.o greet.o"
end
File task创建的目的是为了方便执行如编译等任务。因为在执行编译任务时,并不需要每次都编译所有文件,而只需编译那些还未被编译或者是经过修改的文件。
如上面那个例子中所示,File task的前置条件就是一些文件,而是否执行当前任务的前提就是:当前任务名称中的文件不存在或者它比前置条件中的文件要老。
比如"main.o"任务,它的执行条件是:"main.o"文件不存在,或者"main.c"、"greet.h"中的任一文件要比"main.o"文件要新。(这里的新老比较的是文件的最后修改时间)
lib
Rake的标准库非常丰富,有一些常用的task,这使得rakefile的编写变得更加简单。
调用
Rake任务通过命令行调用, 具体请见:http://docs.rubyrake.org/user_guide/chapter02.html
其它
1. Rule: 为一些类似的task,我们希望可以把它抽象出来。Rule的存在就是为解决这个问题的。
比如我们尝试调用"mycode.o"这个task,但发现并没有这个task的定义存在。那么,rake就会尝试去寻找可以匹配这个任务的rule。然后发现有这样一条rule存在:
rule '.o' => ['.c'] do |t|
sh "cc #{t.source} -c -o #{t.name}"
end
这条rule会匹配所有以".o"结尾的task,但它有一个前提:必须有一个相同名字,而且以".c"结尾的文件存在。所以,如果rake找到了"mycode.c"文件,它就会自动创建一个把"mycode.c"编译成"mycode.o"的任务。
2. Call one task from inside another task
有时候,我们希望一个task在另一个task运行中的某个环节执行,那么需要在一个task的执行中,而不是前置,去调用另一个task。
task :primary do
Rake::Task[:secondary].invoke
end
task :secondary do
puts "Doing Secondary Task"
end
Secondary task的执行和其它task无异,secondary task的前置task也会先执行。但最需要注意的一点是,如果secondary task在之前已经被执行过,那么就不会再执行,即使如这样显示的invoke(遵循Dependency Based Programming的原则)。
如果你确实想无论如何都再次执行secondary task,那么就跳出task的范畴,用ruby方法来代替secondary task吧。
Reference
Rake API: http://rake.rubyforge.org/
User Guide: http://docs.rubyrake.org/user_guide/index.html
Using the Rake Build Language: http://martinfowler.com/articles/rake.html
分享到:
相关推荐
Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...
来自practical rails social networking sites上的第二章的实例,应用了数据导入,导入数据到mysql后就可以使用,命令: rake db:migrate(进入文件夹"railscoder")
- `rake rails:unfreeze`: 解锁应用程序,使其不再使用冻结的 gems 或 Edge Rails,返回到系统 gems 的流动使用状态。 - **更新 Rails**: - `rake rails:update`: 更新应用程序中的 scripts 和 public/...
Rails Admin枚举4 Rails Admin插件,用于正确查看Rails 4.1枚举 安装 gem 'rails_admin_enum4', github: 'sibext/rails_admin_enum4' bundle install 用法 通过生成器生成新模型: rails g model Sibext service:...
总的来说,这个面试练习题涵盖了Rails开发的核心技能:Rake任务管理、测试驱动开发、模型和控制器的实现以及文档编写。理解并熟练运用这些知识是成为一名优秀的Rails开发者的关键。通过深入学习和实践,你可以提高...
1. **Rakefile**: 每个 Rails 项目都有一个 Rakefile 文件,这是 Rake 执行任务的入口点。在这个文件中,你可以定义自定义的任务。 2. **Task 定义**: 使用 `desc` 来描述任务,然后使用 `task` 关键字来定义任务。...
在Ruby on Rails框架中,`rake`是一个不可或缺的工具,它扮演着构建、部署和管理任务的角色。Rake,全称为“Ruby Make”,是Ruby语言的一个构建系统,灵感来源于Perl的Make工具和Ant。在Rails应用中,`rake`不仅用于...
还有一个对称任务rake db:restore ,它可以从标准输入中还原数据库。 要求 Rails 版本 2.3 到 4.2 已经过测试和支持。 支持的数据库引擎:MySQL、PostgreSQL、SQLite。 命令行实用程序必须在 PATH 中可用: 对于 ...
Ruby on Rails,简称Rails,是基于Ruby语言的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习...
Rails ::虚拟 使用RSpec或Test :: Unit为引擎生成虚拟应用程序的简单任务。 安装 将此行添加到您的应用程序的Gemfile中: gem 'rails-dummy' 然后执行: $ bundle 或自己安装为: $ gem install rails-dummy ...
在Ruby on Rails框架中,命令行工具是开发者日常工作中不可或缺的一部分。Rails命令允许我们快速地构建应用程序、管理数据库、生成代码以及执行各种自动化任务。以下是一些关键的Rails命令及其详细解释: 1. **创建...
标题中的"rake-0.8.7.tgz"是一个压缩包,包含了rake的一个特定版本——0.8.7,它是Rails开发过程中的一个重要组件。描述中提到的“rake for rails”以及“rake-0.8.7安装rails必须资源”进一步强调了rake在Rails环境...
- **运行Rake任务**:Rake是一种用于自动化任务的工具,NetBeans支持执行Rake脚本。 - **使用IRB**:Interactive Ruby Shell (IRB) 是一个强大的交互式Ruby解释器,NetBeans集成此功能。 #### 五、操作Rails项目 -...
- `rake rails:unfreeze`: 解锁应用,使其不再使用冻结的gems或Edge Rails,并返回到系统gems的流体使用状态。 - `rake rails:update`: 更新应用中的scripts和public/javascripts目录与Rails保持一致。 - `rake ...
Rails3 是 Ruby on Rails 框架的一个版本,它提供了一系列强大的命令行工具,使得开发者可以快速地构建和管理Web应用。在本文中,我们将深入探讨Rails3中的常用命令,帮助你更高效地进行开发工作。 首先,新建一个...
提供用于Rails 4.x(及更高版本)资产管道的Sprockets实现。 安装 gem 'sprockets-rails' , :require => 'sprockets/railtie' 或者,如果禁用了Bundler自动请求功能,则在config/application.rb require 'sprockets...
自制 命令: rails doc cd doc rake rails:freeze:gems 或 rake rails:freeze:edge rake doc:rails 在rails_app/doc/doc/目录中就生成了一个API目录,即可
5. **rake-0.8.1.gem**:Rake是Ruby社区广泛使用的构建工具,类似于Java的Ant或Python的setup.py。它允许开发者定义任务并用Ruby代码编写,使得项目构建、测试和部署更加自动化。 6. **rails-2.1.0.gem**:这是...