Rake

维基百科,自由的百科全书
跳转到导航 跳转到搜索
Rake
開發者Jim Weirich英语Jim Weirich
当前版本12.3.0(2017年11月15日,​8年前​(2017-11-15
源代码库
  • {{URL|example.com|可选的显示文本}}
Module:EditAtWikidata第29行Lua错误:attempt to index field 'wikibase' (a nil value)
编程语言Ruby
引擎
    Module:EditAtWikidata第29行Lua错误:attempt to index field 'wikibase' (a nil value)
    操作系统Cross-platform
    类型Software development tools
    许可协议MIT License
    网站ruby.github.io/rake/

    Rake是一款软件任务管理及組建自動化工具。用户可指定任务、描述依赖关系及分组命名空间中的任务。

    此软件与SConsMake类似,但有着诸多差异。Rake使用Ruby编写,使用以Ruby语法编写的Rakefile(与Make中的Makefile等同)。此软件由吉姆·韦里奇英语Jim Weirich编写。

    Rake使用Ruby的匿名函数块来定义多个任务并允许用户使用Ruby语法。它拥有共同任务库,例如:控制文件任务的函数及移除已编译文件(即“clean”任务)的库。与Make相似的是,Rake同样可以根据模式来合成任务,例如:根据文件名自动构建文件编译任务。Rake现已成为Ruby 1.9后标准库的一部分。

    示例[编辑]

    下方是一个简单的用于构建C语言 “Hellow, world!”程序的Rake脚本。

      file 'hello.o' => 'hello.c' do
        sh 'cc -c -o hello.o hello.c'
      end
      file 'hello' => 'hello.o' do
        sh 'cc -o hello hello.o'
      end
    

    要查看更多示例,请参见Rakefile 文件格式页面存档备份,存于互联网档案馆)文档。

    规则[编辑]

    当文件被列为先决条件但不含有为其定义的文件任务时,Rake将尝试通过查看Rakefile所支持的规则列表来合成任务。例如,假设我们尝试调用任务"我的代码.o"却不为其定义任务,且Rakefile规则如下所示:

    rule '.o' => '.c' do |t|
      sh "cc #{t.source} -c -o #{t.name}"
    end
    

    此规则将自动合成任意以“.o”为后缀名的任务。前提条件是必须存在拓展名为“.c”的源文件。若Rake可以找到名为“我的代码.c”的源文件,其将自动新建任务将“我的代码.c”构建为“我的代码.o”。若文件“我的代码.c”不存在,Rake将尝试为其递归合成规则。

    当任务从规则中合成后,任务的原属性被设置为匹配源文件。这点使得用户可撰写含引用源文件操作的规则。

    高级规则[编辑]

    任意正则表达式均可作为规则模式。除此之外,进程也可用于计算源文件名称以允许复杂的模式及源。

    下方规则与上方示例等同:

    rule(/\.o$/ =>
      ->(t_name){ t_name.sub /\.o$/, '.c' }) do |t|
      sh "cc #{t.source} -c -o #{t.name}"
    end
    

    请注意:根据Ruby语法习惯,当首个参数为正则表达式时需要在规则旁插入括号。

    下列规则可用于Java文件:

    rule '.class' => ->(t_name){ t_name
        .sub(/\.class$/, '.java')
        .sub(/^classes\//, 'src/') } do |t|
      java_compile(t.source, t.name)
    end
    

    下方是个简单的Rake合成配方示例:

    namespace :cake do
      desc '做煎饼馃子'
      task :pancake => [:egg,:mianhu,:conghua,:baking_powder] do
         puts "凉油"
      end
      task :mianhu do
        puts "放上凉面糊推成圆饼型"
      end
      task :egg => :mianhu do
        puts "打上1{{frac|1|2}}个鸡蛋"
      end
      task :conghua do
        puts "放上1{{frac|1|4}}勺葱花"
      end
      task :egg do
       puts "打上1个鸡蛋"
      end
      task :qiguo do
       puts "铲起大饼打包"
      end
    end
    

    另请参阅[编辑]

    外部链接[编辑]