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
    

    另請參閱[編輯]

    外部連結[編輯]