`
andyhu1007
  • 浏览: 199793 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Rails每周一题(十五): Rake

阅读更多

简介

 

简单而言,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

3
0
分享到:
评论

相关推荐

    Rails的精简版本Rails::API.zip

    Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...

    rails简单实例_rake数据导入

    来自practical rails social networking sites上的第二章的实例,应用了数据导入,导入数据到mysql后就可以使用,命令: rake db:migrate(进入文件夹"railscoder")

    java基础之rails命令大全.pdf

    - `rake rails:unfreeze`: 解锁应用程序,使其不再使用冻结的 gems 或 Edge Rails,返回到系统 gems 的流动使用状态。 - **更新 Rails**: - `rake rails:update`: 更新应用程序中的 scripts 和 public/...

    rails_admin_enum4:Rails Admin Rails 4.1枚举

    Rails Admin枚举4 Rails Admin插件,用于正确查看Rails 4.1枚举 安装 gem 'rails_admin_enum4', github: 'sibext/rails_admin_enum4' bundle install 用法 通过生成器生成新模型: rails g model Sibext service:...

    Ruby On Rails 面试系列七,一个面试练习题

    总的来说,这个面试练习题涵盖了Rails开发的核心技能:Rake任务管理、测试驱动开发、模型和控制器的实现以及文档编写。理解并熟练运用这些知识是成为一名优秀的Rails开发者的关键。通过深入学习和实践,你可以提高...

    Rails3 使用rake启动后台任务

    1. **Rakefile**: 每个 Rails 项目都有一个 Rakefile 文件,这是 Rake 执行任务的入口点。在这个文件中,你可以定义自定义的任务。 2. **Task 定义**: 使用 `desc` 来描述任务,然后使用 `task` 关键字来定义任务。...

    rake-0.8.7

    在Ruby on Rails框架中,`rake`是一个不可或缺的工具,它扮演着构建、部署和管理任务的角色。Rake,全称为“Ruby Make”,是Ruby语言的一个构建系统,灵感来源于Perl的Make工具和Ant。在Rails应用中,`rake`不仅用于...

    rails_db_dump:用于万无一失的数据库转储的 Rake 任务

    还有一个对称任务rake db:restore ,它可以从标准输入中还原数据库。 要求 Rails 版本 2.3 到 4.2 已经过测试和支持。 支持的数据库引擎:MySQL、PostgreSQL、SQLite。 命令行实用程序必须在 PATH 中可用: 对于 ...

    Ruby on Rails入门经典代码

    Ruby on Rails,简称Rails,是基于Ruby语言的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习...

    rails-dummy:为测试和Rails引擎生成虚拟的Rails应用程序

    Rails ::虚拟 使用RSpec或Test :: Unit为引擎生成虚拟应用程序的简单任务。 安装 将此行添加到您的应用程序的Gemfile中: gem 'rails-dummy' 然后执行: $ bundle 或自己安装为: $ gem install rails-dummy ...

    rails有用的命令

    在Ruby on Rails框架中,命令行工具是开发者日常工作中不可或缺的一部分。Rails命令允许我们快速地构建应用程序、管理数据库、生成代码以及执行各种自动化任务。以下是一些关键的Rails命令及其详细解释: 1. **创建...

    rake-0.8.7.tgz

    标题中的"rake-0.8.7.tgz"是一个压缩包,包含了rake的一个特定版本——0.8.7,它是Rails开发过程中的一个重要组件。描述中提到的“rake for rails”以及“rake-0.8.7安装rails必须资源”进一步强调了rake在Rails环境...

    NetBeans Ruby and Rails IDE with JRuby 2009

    - **运行Rake任务**:Rake是一种用于自动化任务的工具,NetBeans支持执行Rake脚本。 - **使用IRB**:Interactive Ruby Shell (IRB) 是一个强大的交互式Ruby解释器,NetBeans集成此功能。 #### 五、操作Rails项目 -...

    ruby命令集合(一些有用的命令)

    - `rake rails:unfreeze`: 解锁应用,使其不再使用冻结的gems或Edge Rails,并返回到系统gems的流体使用状态。 - `rake rails:update`: 更新应用中的scripts和public/javascripts目录与Rails保持一致。 - `rake ...

    Rails3常用命令行命令

    Rails3 是 Ruby on Rails 框架的一个版本,它提供了一系列强大的命令行工具,使得开发者可以快速地构建和管理Web应用。在本文中,我们将深入探讨Rails3中的常用命令,帮助你更高效地进行开发工作。 首先,新建一个...

    sprockets-rails:Sprockets Rails集成

    提供用于Rails 4.x(及更高版本)资产管道的Sprockets实现。 安装 gem 'sprockets-rails' , :require => 'sprockets/railtie' 或者,如果禁用了Bundler自动请求功能,则在config/application.rb require 'sprockets...

    rails API(html)

    自制 命令: rails doc cd doc rake rails:freeze:gems 或 rake rails:freeze:edge rake doc:rails 在rails_app/doc/doc/目录中就生成了一个API目录,即可

    rails本地安装包完整版

    5. **rake-0.8.1.gem**:Rake是Ruby社区广泛使用的构建工具,类似于Java的Ant或Python的setup.py。它允许开发者定义任务并用Ruby代码编写,使得项目构建、测试和部署更加自动化。 6. **rails-2.1.0.gem**:这是...

Global site tag (gtag.js) - Google Analytics