亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

寫一個漂亮Rakefile的方法

2020-10-29 19:45:46
字體:
來源:轉載
供稿:網友

Rake 我就不再介紹了,Ruby 的 Make ,許多方面都比 Make 要更好用一些。和 Makefile 不同的是,Rakefile 本身其實就是一段 Ruby 代碼,這樣的好處有很多,一方面在 Rake 里面就可以很直接地做任何 Ruby 能做的事了,另一方面由于 Ruby 對 DSL 支持良好,所以 Rakefile 通??雌饋硪膊⒉荒敲础按a”。

不過,代碼始終是代碼,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
      @extra_dep = []
    end
    @sources = FileList[]
    @dest_dir = '.'
    @include_path = []
    @flags = "-W +warn_unused_vars +warn_unused_import"

    yield self if block_given?
    define
  end

 
  def define
    beams = @sources.pathmap(File.join(@dest_dir, '%n.beam'))

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

    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

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

首先定義一些 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'
    t.include_path = '../include'
    t.extra_dep = :library
end

看起來就清爽多了!并且可以重復利用。  末了,順便再感嘆一下,雖然最近都是用 Python 用得多一些,但是每次再寫 Ruby 都能感覺到寫起來很舒服,這是基本不可能在 Python 里找到的感覺?。?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性一区二区三区| 日韩不卡在线观看| 日韩中文在线观看| 隔壁老王国产在线精品| 久久久影视精品| 中文字幕av一区二区| 美女扒开尿口让男人操亚洲视频网站| www.亚洲一区| 国产精品永久免费观看| 日韩精品在线第一页| 亚洲一区二区福利| 久久国产精品久久久久久久久久| 欧美成人免费小视频| 日韩av电影在线网| 欧美老妇交乱视频| 亚洲天堂av综合网| 欧美性猛交丰臀xxxxx网站| 尤物九九久久国产精品的特点| 欧美在线亚洲一区| 亚洲免费中文字幕| 亚洲欧美日韩国产成人| 午夜精品久久久久久久久久久久久| 国产日韩欧美中文| 国内精品伊人久久| 国产精品美女在线| 日韩免费看的电影电视剧大全| 亚洲图片欧美午夜| 国产+人+亚洲| 欧美日韩一区二区三区| 国产精品国内视频| 青青a在线精品免费观看| 日韩av在线免费看| 奇米成人av国产一区二区三区| 亚洲精选一区二区| 国产成人精品一区二区| 三级精品视频久久久久| 国产日产久久高清欧美一区| 国产精品xxxxx| 亚洲精品v欧美精品v日韩精品| 亚洲精品欧美日韩专区| 高清日韩电视剧大全免费播放在线观看| 日韩中文av在线| 国产亚洲激情视频在线| 国产精品免费观看在线| 成人中文字幕在线观看| 成人av色在线观看| 久久精品国产综合| 日本精品久久中文字幕佐佐木| 亚洲天堂免费观看| 久久色免费在线视频| 欧美激情a∨在线视频播放| 久久色免费在线视频| 日本道色综合久久影院| 亚洲精品www| 奇门遁甲1982国语版免费观看高清| 亚洲一区二区免费在线| 日韩电影中文字幕一区| 韩国精品久久久999| 久久久久久久久久久久久久久久久久av| 亚州欧美日韩中文视频| 亚洲电影在线看| 欧美理论电影网| 97国产一区二区精品久久呦| 精品久久中文字幕| 精品国产乱码久久久久久虫虫漫画| 精品magnet| 亚洲免费中文字幕| 久久人人97超碰精品888| 一区二区三区视频免费在线观看| 国产精品一区二区三区免费视频| 一区二区三区回区在观看免费视频| 久久精品国产96久久久香蕉| 久久91精品国产91久久跳| 欧美性受xxxx白人性爽| 51视频国产精品一区二区| 亚洲综合日韩在线| 国产中文欧美精品| 色偷偷av一区二区三区乱| 色偷偷av一区二区三区| 国产一区二区三区在线观看视频| 人人做人人澡人人爽欧美| 黑人巨大精品欧美一区免费视频| 亚洲深夜福利视频| 亚洲自拍偷拍一区| 国产精品美乳一区二区免费| 91精品久久久久久久久久久| 欧美精品性视频| 欧美日韩国产一中文字不卡| 国产精品久久久久久久久久久不卡| 中文字幕不卡av| 97在线视频精品| 最近2019中文字幕大全第二页| 另类图片亚洲另类| 久久69精品久久久久久国产越南| 久久久在线免费观看| 97高清免费视频| 日韩电影免费在线观看中文字幕| 亚洲精品aⅴ中文字幕乱码| 欧美激情视频一区二区| 庆余年2免费日韩剧观看大牛| 亚洲精品视频免费| 国产精品嫩草影院一区二区| 国产在线精品自拍| 精品国内产的精品视频在线观看| 九九热精品视频国产| 欧美电影在线观看| 亚洲精品国产综合区久久久久久久| 亚洲自拍另类欧美丝袜| 欧美性生交大片免费| 国产美女久久精品香蕉69| 欧美在线观看日本一区| 久久久久久综合网天天| 91av视频在线免费观看| 91精品国产色综合久久不卡98| 日本精品视频在线播放| 亚洲免费影视第一页| 久久久午夜视频| 日韩免费av在线| 色偷偷av一区二区三区乱| 国产女精品视频网站免费| 黑人巨大精品欧美一区二区免费| www.亚洲人.com| 日本精品久久久久影院| 日本亚洲欧美成人| 亚洲免费影视第一页| 色综合亚洲精品激情狠狠| 午夜精品一区二区三区在线视频| 国产一区二中文字幕在线看| 久久免费高清视频| 精品网站999www| 国产一区二区视频在线观看| 国产成人avxxxxx在线看| 亚洲r级在线观看| 国产亚洲精品久久| 日韩亚洲成人av在线| 国内外成人免费激情在线视频网站| 成人激情电影一区二区| 久久中文字幕在线| 精品无人区太爽高潮在线播放| 日韩精品久久久久| 国产精品久久久久久久久久久不卡| 欧美丝袜第一区| 亚洲精品美女在线观看播放| 国产精品久久色| 亚洲精品av在线播放| 欧美人成在线视频| 91丨九色丨国产在线| 久久人人爽人人爽人人片亚洲| 日韩国产欧美区| 欧美成人精品在线| 日日狠狠久久偷偷四色综合免费| 亚洲第一天堂av| 亚洲一级免费视频| 久久国产精品偷| 国产精品丝袜久久久久久不卡| 两个人的视频www国产精品| 日韩av中文在线| 久久资源免费视频| 亚洲护士老师的毛茸茸最新章节| 精品久久中文字幕久久av| 欧美激情视频三区| 欧美野外猛男的大粗鳮| 国内伊人久久久久久网站视频| 久久久www成人免费精品张筱雨|