rake 我就不再介紹了,ruby 的 make ,許多方面都比 make 要更好用一些。和 makefile 不同的是,rakefile 本身其實就是一段 ruby **,這樣的好處有很多,一方面在 rake 裡面就可以很直接地做任何 ruby 能做的事了,另一方面由於 ruby 對 dsl 支援良好,所以 rakefile 通常看起來也並不那麼「**」。
不過,**始終是**,makefile 尚且可以寫得很亂,rakefile 要寫亂就更容易了,幸運地是,rake 提供了一些功能讓我們可以來對 rakefile 做一些組織工作。
其中之一就是 import 功能,把不同功能的 task 寫到不同的檔案中,例如,像這個樣子:
複製** **如下:
rakefile
task/
+-- doc.rake
+-- compile.rake
`-- deploy.rake
這樣,在 rakefile 裡寫上
複製** **如下:
import("task/doc.rake")
這樣的語句匯入各個子任務即可,不同的任務寫到不同的檔案裡面就不會一團糟了。而且,import 同 ruby 自己的 require 不一樣,import 並不是立即進行匯入的,而是在整個 rakefile 執行結束之後才全部匯入,因此,可以在任意的地方寫 import ,而不用擔心依賴關係,需要共享的變數之類的只要在主 rakefile 中定義了即可。
import 是組織不同的功能模組,除此之外,rake 還允許我們對一些重複性的任務進行抽象,具體來說,就是自定義的 task 。通常情況下,我們使用 rake 提供的通用 task 和檔案 task 來構造我們需要完成的工作,除此之外,rake 還自帶了一些針對特殊任務的 task 型別,例如構建 rdoc 或者執行 test 等。實際上,一種任務就是乙個普通的 ruby 類,我們可以繼承 rake 裡的 task 類並重新定義相關的函式來實現自定義的 task 型別。不過,這樣多少有些麻煩,實際上,很多時候我們要定義的任務都可以分解為一些小任務用內建的通用 task 和 file task 來實現的,這個時候可以用 tasklib 來更方便地定義自定義的任務。
具體地來說,就是寫乙個類,繼承自 tasklib (雖然實際上只是約定而並不是必須的),然後在這個類的初始化函式裡用 task 或者 file 來定義實際完成任務的子 task 即可。用乙個實際的例子來說,比如說,我們可以定義乙個 erlctask ,可以用來把一些 erlang 檔案編譯到某個目錄下,並在 clean 的時候自動能把編譯出來的 .beam 檔案清理掉:
複製** **如下:
require 'rake'
require 'rake/clean'
require 'rake/tasklib'
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
def initialize(name = :erlc)
# default values
if name.is_a? hash
@name = name.keys.first
@extra_dep = name.values.first
else
@name = name
&gqanvnbsp; @extra_dep =
&程式設計客棧nbsp; end
@sources = filelist
@dest_dir = '.'
@include_path =
@flags = "-w +warn_unused_vars +warn_unused_import"
yield self if block_given?
define
enddef define
beams = @sources.pathmap(file.join(@dest_dir, '%n.beam'))
include_path = array(@include_path).map.join(" ")
directory @dest_dir
beams.zip(@sources).each do |beam, source|
程式設計客棧; file beam => source do
sh "erlc -pa # # # -o # #"
endend
task @name => beams + array(@extra_dep)
clean.include(beams)
endend首先定義一些 task 相關的屬性,在初始化函式裡設定初值,然後呼叫 block 來填充實際的值,最後呼叫 define 函式,define 函式就使用 directory 、file 和 task 分別定義了建立目錄、編譯和清理的任務。如果了解 ruby 和 rake 的基本語法的話,應該很容易看明白了。
接下來把這個檔案儲存到某個 .rb 裡,然後在 rakefile 裡 require 之,就可以這樣寫了:
複製** **如下:
erlctask.new :compile do |t|
t.sources = filelist['src/*.erl']
t.dest_dir = '../ebin'
&程式設計客棧nbsp; t.include_path = '../include'
t.extra_dep = :library
end看起來就清爽多了!並且可以重複利用。 末了,順便再感嘆一下,雖然最近都是用 python 用得多一些,但是每次再寫 ruby 都能感覺到寫起來很舒服,這是基本不可能在 python 裡找到的感覺啊!
本文標題: 寫乙個漂亮rakefile的方法
本文位址: /jiaoben/ruby/109040.html
Flutter開發 寫乙個漂亮的導航欄
在ios中,你要寫乙個漂亮的導航欄,如果想要自己定製,那是需要花點時間的,甚至可能你要完全重寫,而且導航欄中存在很多你設定後不生效的東西,對於初學者,甚至入門三四年的人的來說,依然是乙個噩夢。而在flutter中,flutter為我們提供了豐富的元件,你可以選擇像在ios裡那樣自定義乙個view,來...
乙個難看的證明和乙個漂亮的證明
matrix67.com 北大出的那本 離散數學教程 是我所見過的最破的教材,裡面頻繁出現一些諸如假設m和n怎麼怎麼樣結果推出了p和q怎麼怎麼樣的印刷錯誤 在短短三頁紙中,peano 被拼寫錯了四次,而且每次錯的都不一樣。離散數學本身是相當科學的。離散數學中的證明,特別是圖論證明,都是相當有趣的。但...
隨手記乙個漂亮的code
從前有個 長這樣 if a else 後來長這樣 if a b a d 再後來長這樣。if a?b d 有時候,我們需要從陣列中篩選一些東西,filter當然可以,但是有些定製化的東西就很難,而且,在foreach中不能return。every 解決foreach中的return array.eve...