威尼斯人线上娱乐

写七个赏心悦目Rakefile的章程,rake个人笔记

21 7月 , 2019  

Rake 笔者就不再介绍了,Ruby 的 Make ,大多地点都比 Make 要越来越好用一些。和
Makefile 分裂的是,Rakefile 自个儿其实就是一段 Ruby
代码,那样的好处有过多,一方面在 Rake 里面就足以很直白地做任何 Ruby
能做的事了,另一方面出于 Ruby 对 DSL 援救美好,所以 Rakefile
日常看起来也并不那么“代码”。

Rake 是 Ruby 领域的 Make,是个独立的 Ruby 工具,指标是顶替 Unix 中的
make。Rake 依据 Rakefile 和

一篇看到的解说得一板一眼的稿子

但是,代码始终是代码,Makefile 尚且能够写得很乱,Rakefile
要写乱就更易于了,幸运地是,Rake 提供了一些效能让我们得以来对 Rakefile
做一些团体育赛事业。

.rake 文件创设职责。Rails 使用 Rake
落成科学普及的田间管理职分,特别是相比较复杂的职分。

此地还会有一部分例证:

里头之一正是 import 作用,把不相同作用的 task
写到差异的文本中,比如,像这些样子:

rake about 职务输出以下消息:Ruby、RubyGems、Rails 的版本号,Rails
使用的零部件,程序所在的公文夹,Rails

Rake Documentation 
Rails Rake
Tutorial 
Using the Rake Building
Language

复制代码 代码如下:

当前所处的条件名,程序选择的数据库适配器,数据库格局版本号。即使想向外人须要支持,检查安全补丁是不是影响程序,也许须求查阅现成Rails

 

Rakefile
task/
威尼斯人线上娱乐 ,  +– doc.rake
  +– compile.rake
  `– deploy.rake

程序的新闻,能够采用那么些职分。

===========================================================================================================

这样,在 Rakefile 里写上

rake assets:precompile 任务会预编写翻译 app/assets
文件夹中的静态能源文件。rake assets:clean

那是Rails
Envy网址的一篇Rake指南,你能够在这里找到最初的作品。

复制代码 代码如下:

职责会把编写翻译好的静态财富文件删除。

作为Ro翼虎开垦者,你对Rake一定不会素不相识,你大概用它来形成你的单元测量试验,也或许是迁移数据库,不过你真的通晓那一个Rake职务到底是怎么运营的吗?你有尝试过创立你本身的Rake职责吗?

import(“task/doc.rake”)

Rake 命名空间 db: 中最常用的职责是 migrate 和
create,那多个职责会尝试运转具有迁移相关的 Rake

在这篇小说中,大家将会介绍Rake的来头,以及怎么样在Rails中应用它,通过这篇作品的就学,你将驾驭怎样采纳Rake成立你自个儿的任务。

那般的言辞导入种种子任务就能够,分歧的职分写到分化的文本之中就不会一团糟了。况且,import
同 Ruby 本身的 require 分化,import 并不是随即展开导入的,而是在漫天
Rakefile 实践实现之后才全部导入,由此,能够在随性所欲的地点写 import
,而不用忧虑信赖关系,需求分享的变量之类的只要在主 Rakefile
中定义了就可以。

职务(up,down,redo,reset)。rake db:version
在排查难点时很有用,会输出数据库的近来版本。

为什么要有Rake

import 是团伙分化的功用模块,除外,Rake
还同意我们对有个别重复性的职务张开抽象,具体来讲,即是自定义的 task
。日常状态下,我们利用 Rake 提供的通用 task 和文件 task
来布局大家须求完成的办事,除此而外,Rake 还自带了部分对准特殊任务的 task
类型,举例营造 rdoc 只怕运营 test 等。实际上,一种任务正是叁个惯常的
Ruby 类,我们能够承接 Rake 里的 Task
类并再度定义相关的函数来促成自定义的 task
类型。可是,那样有一点点有个别麻烦,实际上,比较多时候大家要定义的天职都足以表明为一些小职务用内置的通用
task 和 file task 来落到实处的,这个时候能够用 Tasklib
来更有益于地定义自定义的职分。

Current version: 20140820034433

要精晓Rake,大家第一得来询问一下Rake的历史悠长的祖先:Make。由此大家须要临时回到解释型语言发生此前的持久时代,在充足时代,全体代码都须求被编写翻译,然后工夫够被实施,所以当你从Internet下载到三个一定变得庞大的主次后,一般的话,除了源代码,程序包中还有可能会满含叁个近乎
“install_me.sh”的Shell脚本,它会担当帮你成功源代码的编写翻译,并转移最后的可实行文件。

切切实实地以来,就是写一个类,承袭自 Tasklib
(即使事实上只是约定而并非必须的),然后在这些类的开首化函数里用 task
或许 file 来定义实际到位职分的子 task
就可以。用三个事实上的事例来讲,比方说,大家能够定义二个 ErlcTask
,能够用来把一些 Erlang 文件编译到某些目录下,并在 clean
的时候自动能把编译出来的 .beam 文件清理掉:

db:charset 检索当前景况下数据库的字符设置

那看起来很周全,不是吧?对用户来讲大概这么,但对此开拓者来讲,那却是个较工巧的章程,因为固然你只是修改了多少个文书中的一小段代码,”install_me.sh”也亟须将全部的源代码都再也编写翻译一次,技艺生成最终的可试行文件。

复制代码 代码如下:

db:collation 检索当前景况下数据库的核对

为此,针对那几个难点,Bell实验室的斯图尔特 费尔德man创建了Make:

require ‘rake’
require ‘rake/clean’
require ‘rake/tasklib’

db:create 用config\database.yml中的定义创建当前 RAILS_ENV
项目情状下的数据库

  • Make能够辨别自上次编写翻译之后那多少个文件发出了改变,进而在后一次编写翻译时只对那么些爆发变动的文本实行编写翻译,而忽视那叁个从没变化的公文,进而大大降低了先后的编写翻译时间。
  • Make同时帮忙依赖关系追踪,也正是你可以告诉编写翻译器,文件A信赖于文件B,由此当文件B发生转移后,文件A也会被另行编写翻译,况且只要编写翻译文件A时,文件B还并未有被编写翻译,那么Make会告诉编写翻译器应该先编译文件B。

class ErlcTask < Rake::TaskLib
  attr_accessor :name
  attr_accessor :sources
  attr_accessor :dest_dir
  attr_accessor :include_path
  attr_accessor :flags
  attr_accessor :extra_dep

db:create:all 用config\database.yml中的定义创立所有数据库

Make
实际上是四个跟ls和dir大约的可施行文件,只但是你须求提供三个Makefile文件给它当作输入,Makefile中对各种供给编写翻译的文件及它们
的依赖关系实行定义,Makefile的语法类似于Shell脚本,但又有个别分裂,这里我们无需关注Makefile的语法。

  def initialize(name = :erlc)
    # default values
    if name.is_a? Hash
      @name = name.keys.first
      @extra_dep = name.values.first
    else
      @name = name
      @extra_dep = []
    end
    @sources = FileList[]
    @dest_dir = ‘.’
    @include_path = []
    @flags = “-W +warn_unused_vars +warn_unused_import”

db:drop 删除当前 RAILS_ENV项目蒙受中的数据库

趁着Make的语言中立性,任何语言的先后都足以选拔它来作为创设(build)系统,事实上,在Rake发生此前,比很多Ruby项目也是选用Make作为创设系统的。

    yield self if block_given?
    define
  end

db:drop:all 删除全数在 config\database.yml中定义的数据库

您只怕会意外:“Ruby程序并不须要被编写翻译,为啥还要选择Make呢?”,是的,Ruby的确无需编写翻译,事实上,Ruby程序猿使用Make是由于以下多个原因:

 
  def define
    beams = @sources.pathmap(File.join(@dest_写七个赏心悦目Rakefile的章程,rake个人笔记。dir, ‘%n.beam’))

db:reset 从db\schema.rb中为近期情状重新建构数据库(先删后建).

  • 成立任务,对于大型程序来讲,编写翻译达成并不意味着能够终结,往往你必要编写制定第一次全国代表大会堆的脚本来调整它的运转,或许查看它的运营境况等等,这种境况下,你就能够创设贰个Makefile来保管全部那些任务,然后你就可以运用诸如“make
    stupid”,“make clever”来分别运转糊涂和灵性职务了。
  • 依赖关系追踪,当您从头写贰个库的时候,你也许会发觉,更加的的的天职存在重复,比方”migrate“和”shema:
    dump“就都急需连接数据库,那时你就足以抽象出多少个”connect_to_db”职责,并设置”migrate”和”shema:
    dump”职责都依靠于”connect_to_db”,那样当您独自运营”migrate”或许”shema:dump”职务时,
    “connect_to_db”职责都会被第一调用,假若您何况运行那三个任务,那么”connect_to_db”职分只会被实行二次。

    include_path = Array(@include_path).map{|incl|”-I”+incl}.join(”
“)

db:rollback
回滚(浙大出版社一本SQLSEWranglerVE传祺书的名词[很意外为啥不间接用滚回])数据库到前一个版本.
钦定回滚到哪一步要用

Rake是怎么来的?

    directory @dest_dir
    beams.zip(@sources).each do |beam, source|
      file beam => source do
        sh “erlc -pa #{@dest_dir} #{@flags} #{include_path} -o
#{@dest_dir} #{source}”
      end
    end

STEP=n 参数

大多年在此从前,当 Jim
Weirich还在为二个Java项目专门的学业时,他开始时期的抉择也是Makefile,不过高速他意识到:若是能够在Makefile中嵌入Ruby代码,那会是何其的便利啊,于是,Rake就那样发生了。

    task @name => beams + Array(@extra_dep)
    CLEAN.include(beams)
  end
end

db:version 检索当前方式下的版本

Rake协理职务创立,职责依赖关系追踪,以及文件编写翻译时间识别。最终一个功用对Ruby程序员应该用不到,但万一你同期依然三个C技术员,那么您能够尝试运用Rake来顶替Make。

首先定义一些 Task 相关的质量,在伊始化函数里设置初值,然后调用 block
来填充实际的值,最终调用 define 函数,define 函数就选取 directory 、file
和 task 分别定义了树立目录、编写翻译和清理的职务。借使精晓 Ruby 和 Rake
的主导语法的话,应该很轻易看明白了。

备份数据库

Rake如何做事

接下去把这些文件保留到有些 .rb 里,然后在 Rakefile 里 require
之,就足以如此写了:

rake db:backup:create 依照database.yml的音信备份数据库

让大家经过叁个例证来证实呢,若是本身明天很烦躁,想要借酒消愁,这么些进程涉及以下多少个任务:

复制代码 代码如下:

rake db:backup:destroy 暗许删除一天前的备份数据

  1. 买酒
  2. 买下酒小菜
  3. 搞掂它们

ErlcTask.new :compile do |t|
    t.sources = FileList[‘src/*.erl’]
    t.dest_dir = ‘../ebin’
    t.include_path = ‘../include’
    t.extra_dep = :library
end

rake db:backup:rebuild 暗中认可苏醒最新的备份数据

只要使用Rake来保管那3个职分,那么作者第一必要创设一个Rakefile文件:

看起来就率直多了!何况能够另行使用。 
最后,顺便再惊讶一下,尽管近年来都以用 Python 用得多一些,可是每回再写
Ruby 都能感觉到写起来很舒服,那是主导不也许在 Python 里找到的认为啊!

doc: 命名空间中的职分能够转换程序的文书档案,Rails API 文书档案和 Rails

task :purchaseAlcohol do  puts "来瓶五粮液"endtask :mixDrink do  puts "上盘花生米"endtask :getSmashed do  puts "老板, 啥时学的分身术, 很强嘛?"end

指南。生成的文书档案能够专断划分,收缩程序的高低,适合在嵌入式平台利用。

接下来作者就足以从Rakefile文件所在的目录来产生那一个义务了:

rake doc:app 在 doc/app 文件夹中生成程序的文书档案;

$ rake purchaseAlcohol来瓶五粮液$ rake mixDrink上盘花生米$ rake getSmashed老板, 啥时学的分身术, 很强嘛?

rake doc:guides 在 doc/guides 文件夹中变化 Rails 指南;

很轻易吗!但是有些标题,小编可不想还没吃酒吃东西就见到老董的分娩,那会被人作为精神不正规。

rake doc:rails 在 doc/api 文件夹中生成 Rails API 文书档案;

怎么着组织职分的注重关系

rake routes
会列出程序中定义的具有路由,可为消除路由难题提供支援,还足以让您对先后中的全部U君越L 有个总体精通。

很简单:

rake time:zones:all 列出 Rails 能知晓的兼具时区

task :purchaseAlcohol do  puts "来瓶五粮液"endtask :mixDrink => :purchaseAlcohol do  puts "上盘花生米"endtask :getSmashed => :mixDrink do  puts "老板, 啥时学的分身术, 很强嘛?"end

rake stats输出你应用程序的有用总括,展现千行代码数和测量检验比例等

搞掂,未来再试试:

以坐火车为例:

$ rake purchaseAlcohol来瓶五粮液$ rake mixDrink来瓶五粮液上盘花生米$ rake getSmashed来瓶五粮液上盘花生米老板, 啥时学的分身术, 很强嘛?

分:1.买票2.进站3.乘车

就好像你见到的,未来本身想要醉必须得先喝点酒吃点花生才行,不过一位饮酒总归有些俗气,所以本人想喊些汉子合伙来喝,不过本身又懒得跟他们解释为何忽地喊他们来吃酒(本身日常可比吝啬),笔者想到二个偷懒的主意,给他们看文档,可是毕竟该怎么为自家的Rake职责生成文书档案呢?

在rakefile文件中写这么一个task

为Rake职责生成文书档案
再轻巧但是了:

task :action1 do

desc "工作郁闷,想喝点酒"task :purchaseAlcohol do  puts "来瓶五粮液"enddesc "得有点下酒菜"task :mixDrink => :purchaseAlcohol do  puts "来盘花生米"enddesc "开喝,不醉不归"task :getSmashed => :mixDrink do  puts "老板, 啥时学的分身术, 很强嘛?"end

puts “买票”

就像是您见到的,小编的种种职分都有了三个desc字段,未来自己和自家的爱人们就足以透过rake
-T或许rake –task来查阅各种职务的文书档案了:

end

$ rake --tasksrake getSmashed # 开喝,不醉不归rake mixDrink # 得有点下酒菜rake purchaseAlcohol # 工作郁闷,想喝点酒

task :action2 do

Rake命名空间

puts “进站”

假诺养成了劳作郁闷就吃酒的好习贯之后,你飞快就能够发觉,自个儿成了个酒鬼,由此你不得不写一大堆Rake职分来集合你的狐朋狗友们,那时你就能意识命名空间的关键:

end

namespace :alcoholic do  desc "工作郁闷,想喝点酒"  task :purchaseAlcohol do    puts "来瓶五粮液"  end  desc "得有点下酒菜"  task :mixDrink => :purchaseAlcohol do    puts "来盘花生米"  end  desc "开喝,不醉不归"  task :getSmashed => :mixDrink do    puts "老板, 啥时学的分身术, 很强嘛?"  endendnamespace :girlfriend do  desc "那个,喝点红酒吧"  task :purchaseAlcohol do    puts "来瓶干红"  endend

task :action3 do

取名空间允许你将您的天职张开归类,你能够在叁个Rakefile内创立四个命名空间,现在输入rake
–tasks你会获得如下输出:

puts “乘车”

rake alcoholic:getSmashed # 开喝,不醉不归rake alcoholic:mixDrink # 得有点下酒菜rake alcoholic:purchaseAlcohol # 工作郁闷,想喝点酒rake girlfriend:purchaseAlcohol # 那个,喝点红酒吧

end

使得的天职

rake action1

地方都是聊天,毕竟人生除了饮酒还或者有更首要的专门的职业等着我们去做,下边,我们来干点正经事,假使大家供给做到这么三个职务,给定一组目录,借使不设有,就创制它们,笔者创制的Rake职务如下:

买票

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  endend

rake action2

暗中认可意况下,Rake具有全部File
Utils包的作用,当然你也足以由此援引其余库来做别的你想做的事体,那么下四个题目便是:笔者应当怎么着在Rails中央银行使Rake呢?

进站

在Rails中使用Rake

rake action3

各样Rails应用本人都在包罗相当多预订义的Rake职责,你能够因而在您的Rails应用的根目录下实施rake
–tasks来查阅可用的rake任务,别未来了,未来就尝试啊,小编等你!

乘车

要创设新的Rake职分,你只需展开你的Rails应用的lib/tasks目录,并将你的Rakefile命名称为”somethins.rake”就能够,它会活动被主Rakefile援用,然后您就足以在主目录下调用你的rake义务了,让大家承接上边十二分例子:

温馨编写的rake职务保存在rails root/lib/tasks中,增加名:.rake

utils.rake

万一在任务中要和顺序的模型交互,比方查询数据库等,可用environment职分,加载程序代码。

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 endend

multitask: copy_files => [copy_src, :copy_doc, :copy_bin]  do

再也施行rake –tasks,你拜会到如下结果

puts “……………”

......rake tmp:pids:clear # Clears all files in tmp/pidsrake tmp:sessions:clear # Clears all files in tmp/sessionsrake tmp:sockets:clear # Clears all files in tmp/socketsrake utils:create_directories # Create blank directories if theydon't already exist

end

从Rake职分中可以访谈rails model吗?

copy_files是二个惯常那多少个任务,它的动作在享有正视任务成功后才会试行,但copy_src,
copy_doc,

没错,当然可以,这是自小编使用Rake最关键的用处:运营一些索要手动实行的天职,大概是亟需脱离Rails定时运转的义务,下边是多少个简练的例证:

copy_bin那四个职务会并行实行,他们中间并无影响,即使那八个职务还借助于任何一同的职责copy_all,则当copy_all施行完后才推行那多少个义务

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  endend

假诺有release职务要求版本号作参数:rake release[0.8.2]

事实上是非常的粗略,你只需求在您的职分以前实施”=> :environment“就足以了。

如此那般参数release就能够传递给release义务,多少个参数能够以逗号隔绝,列表方式传递给职责:rake
name[jon,doe]

倘使需求在支付情势进行这么些职务,直接敲”rake
utils:send_expire_soon_emails”就可以了,即使是成品情势,敲”rake
RAILS_ENV=production
utils:send_expire_soon_emails”,现在一经本人想让这么些职务天天早晨运维叁遍,那么,作者只需求在cronjob文件中步入上面那行就可以了:

rake任务及其参数是以单个命令行参数字传送递给rake的,即中间不一样意有空格。要是职责名和参数名包括空格则需利用引号:

0 0 * * * cd /var/www/apps/rails_app/ && /usr/local/bin/rake RAILS_ENV=production utils:send_expire_soon_emails

rake ”name [billy bob,jon]”

再有更加多的事例吗?

rake release[0.8.2]可以写成rake release RELEASE_VERSION = 0.8.2

毫无顾虑,只要你一时间,並且愿意看,例子大把:

不能够不注脚接受参数的职务才干吸收接纳参数

  • These brand new rake
    tasks in Edge Rails
    create and reset your databases for you. Neato!
  • Craig Ambrose wrote a Rake task to do database
    backups,
    which you can use.
  • Adam Greene put together a set of Rake
    tasks that
    allow you to backup all your data to Amazon S3
  • Jay Fields made a good point when he talked about testing rake
    tasks
  • Err the blog talks about a new way of setting the RAILS_ENV and
    teaches how to use rake to boot you into a Mysql
    shell (be sure to read the comments
    if you browse this one).
  • Last, but not least, there’s the Rake Bookshelf
    Books and Martin Fowler’s Using the
    Rake Build
    Language tutorial .
    Both of these are pretty thorough, but also a little dated

task:name,[:first_name,:last_name]

[:first_name,:last_name]为name职务必要吸取的参数

应用task块的第4个参数能够在动作中访问传递过来的参数

task:name,[:first_name, :last_name] do |t,args|

puts “first name is #{args.first_name}”

end

块中的t总是绑定为当前职责对象,首个参数args正是传递过来的参数对象

为参数钦定暗中认可值

task :name,[:first_name, :last_name] do |t,args|

args.with_defaults(:first_name => ”jon”, :last_name => “jan”

end

命名空间

当rake文件过多时,当你有成千上万职务的时候,你必要关怀它们的命名争论难题,命名空间(namespace)便是二个当然的化解方案。你可感到地点的多个职分定义一个可以称作home的命名空间。

namespace :home do

task :action1 do                                         rake

home:action1

puts “买票”

end              rake home:action2

task :action2 => :action1 do

puts “进站”              rake home:action3

end

task :action3 => :action3 do

puts “乘车”

end

end

desc 能够行使ruby标准注释#,但如若希使用rake –
T来呈现职务的叙说,就要求采纳desc命令描述职务


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图