国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > Ruby > 正文

寫一個漂亮Rakefile的方法

2020-10-29 19:45:46
字體:
供稿:網(wǎng)友

Rake 我就不再介紹了,Ruby 的 Make ,許多方面都比 Make 要更好用一些。和 Makefile 不同的是,Rakefile 本身其實(shí)就是一段 Ruby 代碼,這樣的好處有很多,一方面在 Rake 里面就可以很直接地做任何 Ruby 能做的事了,另一方面由于 Ruby 對 DSL 支持良好,所以 Rakefile 通常看起來也并不那么“代碼”。

不過,代碼始終是代碼,Makefile 尚且可以寫得很亂,Rakefile 要寫亂就更容易了,幸運(yùn)地是,Rake 提供了一些功能讓我們可以來對 Rakefile 做一些組織工作。

其中之一就是 import 功能,把不同功能的 task 寫到不同的文件中,例如,像這個樣子:

復(fù)制代碼 代碼如下:

Rakefile
task/
  +-- doc.rake
  +-- compile.rake
  `-- deploy.rake

這樣,在 Rakefile 里寫上
復(fù)制代碼 代碼如下:

import("task/doc.rake")

這樣的語句導(dǎo)入各個子任務(wù)即可,不同的任務(wù)寫到不同的文件里面就不會一團(tuán)糟了。而且,import 同 Ruby 自己的 require 不一樣,import 并不是立即進(jìn)行導(dǎo)入的,而是在整個 Rakefile 執(zhí)行結(jié)束之后才全部導(dǎo)入,因此,可以在任意的地方寫 import ,而不用擔(dān)心依賴關(guān)系,需要共享的變量之類的只要在主 Rakefile 中定義了即可。

import 是組織不同的功能模塊,除此之外,Rake 還允許我們對一些重復(fù)性的任務(wù)進(jìn)行抽象,具體來說,就是自定義的 task 。通常情況下,我們使用 Rake 提供的通用 task 和文件 task 來構(gòu)造我們需要完成的工作,除此之外,Rake 還自帶了一些針對特殊任務(wù)的 task 類型,例如構(gòu)建 rdoc 或者運(yùn)行 test 等。實(shí)際上,一種任務(wù)就是一個普通的 Ruby 類,我們可以繼承 Rake 里的 Task 類并重新定義相關(guān)的函數(shù)來實(shí)現(xiàn)自定義的 task 類型。不過,這樣多少有些麻煩,實(shí)際上,很多時(shí)候我們要定義的任務(wù)都可以分解為一些小任務(wù)用內(nèi)置的通用 task 和 file task 來實(shí)現(xiàn)的,這個時(shí)候可以用 Tasklib 來更方便地定義自定義的任務(wù)。

具體地來說,就是寫一個類,繼承自 Tasklib (雖然實(shí)際上只是約定而并不是必須的),然后在這個類的初始化函數(shù)里用 task 或者 file 來定義實(shí)際完成任務(wù)的子 task 即可。用一個實(shí)際的例子來說,比如說,我們可以定義一個 ErlcTask ,可以用來把一些 Erlang 文件編譯到某個目錄下,并在 clean 的時(shí)候自動能把編譯出來的 .beam 文件清理掉:

復(fù)制代碼 代碼如下:

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 相關(guān)的屬性,在初始化函數(shù)里設(shè)置初值,然后調(diào)用 block 來填充實(shí)際的值,最后調(diào)用 define 函數(shù),define 函數(shù)就使用 directory 、file 和 task 分別定義了建立目錄、編譯和清理的任務(wù)。如果了解 Ruby 和 Rake 的基本語法的話,應(yīng)該很容易看明白了。

接下來把這個文件保存到某個 .rb 里,然后在 Rakefile 里 require 之,就可以這樣寫了:

復(fù)制代碼 代碼如下:

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
中文字幕网站视频在线| 国产福利在线免费观看| 在线视频中文字幕第一页| 成人精品福利| 开心丁香婷婷深爱五月| 青青草原av在线| 成人欧美亚洲| 国产美女视频一区二区二三区 | 日韩国产成人| 在线中文字幕视频观看| 91中文字幕| av在线天天| 国产女王在线**视频| 精品视频vs精品视频| www.99色.com| 国产极品美女到高潮| 97国产在线| 欧美日韩在线精品成人综合网| 国产在线视频自拍| 国产精品白浆流出视频| 午夜小视频在线| 国产卡二和卡三的视频| 亚洲欧美综合乱码精品成人网 | 亚洲视频精品在线观看| 国产中文在线观看| av中文在线资源| 国产亚洲依依| 亚洲尤物在线视频| 中文字幕在线播放网址| 日本欧洲一区| 亚洲wwwwww| 国产9色视频| 国产精品美女视频免费观看软件 | 国产在线观看av| 91麻豆福利| 国产精品入口免费麻豆| 狠狠干天天爱| 免费a在线观看| 在线天堂视频| 69免费视频| 国产精品666| 最近中文字幕mv免费高清视频8| 国产va在线观看| 午夜伦全在线观看| 国产免费av网站| 在线视频中文字幕久| 天天操天天操一操| 日本中文字幕视频在线| 最近中文字幕av免费高清| 中文字幕日本在线| 国产成人夜间影院在线观看| 69视频在线观看| 精品999视频| 18av在线播放| 精品国产白色丝袜高跟鞋| 亚洲国产日韩在线人成电影| 精品卡1卡2卡三卡免费网站| 在线视频xx| www.色婷婷| 国产中文伊人| 国产对白在线| 亚洲精品自产拍在线观看| 免费在线黄色av| 国产香蕉视频在线观看| 91亚洲精选| 天天操夜夜做| 国产三级视频在线看| 伊人影院在线观看| gogo在线高清视频| 国产精品亚洲第五区在线| 精品一区二区三区在线成人| av中文字幕在线看| 国产一区二区三区四区尤物| av高清在线| 国产理论片免费观看| 夜夜爽视频导航| 国产性一级片| 国产在线www| a视频免费看| 精品一二三区视频| 午夜在线小视频| 免费视频中文字幕| 伊人影院在线视频| 午夜视频在线| 欧美国产中文| 天天干天天摸| 在线视频中文字幕久| 国产日本韩国在线播放| 国产农村av| 高清欧美精品xxxxx在线看| 伊人福利在线| 伊人永久在线| av日韩在线免费| 国产网站av| 中文字幕在线免费观看| 九九在线观看免费视频| av片在线观看永久免费| 国产成+人+亚洲+欧美+综合| 国产69精品久久久久孕妇国产69久久| 国产h在线观看| 国产精品剧情一区二区在线观看 | 最近免费中文字幕在线第一页 | www.色五月| www.操操| 国产中文字幕在线播放| 丁香综合五月| 国产一级在线观看www色| 中文字幕国产视频| 国产一级粉嫩xxxx| 国产一区久久精品| 国产高清视频在线观看| 99综合精品久久| jizz亚洲| 国产小黄视频| 在线观看的av| 久久精品最新免费国产成人| 成av人免费青青久| 天天操人人干| 国产精品二线| h视频在线网站| 五月亚洲综合| 在线免费观看你懂的| 欧美日韩亚洲第一页| 国产视频资源| 精品欧美不卡一区二区在线观看| 日本视频在线| 国产私人影院| 人成在线免费视频| 久草国产视频| 国产黄色免费网| 欧美在线中文| 精品无人区乱码1区2区3区免费| 伊人中文在线| 国产精品视频福利一区二区| av影视在线看| 国产一级在线观看| 青草在线视频在线观看| 91这里只有精品| 国产一级黄色大片| 全网国产福利在线播放| 国产精彩视频在线观看免费蜜芽| 波多野结衣久久高清免费| 国产传媒在线播放| 国产精品一区二三区| 性网站在线看| 精品视频vs精品视频| 国产精品视频流白浆免费视频| 欧洲亚洲精品视频| av中文字幕在线看| 亚洲电影视频在线| 9色在线视频网站| 91高清国产| 国产精品久久久久久精| 天堂在线一二区| 天天草天天爽| 日本啊v在线| 日本精品一区二区三区在线播放| 国产福利在线看| 国产系列在线观看| 国产天堂在线| 国产午夜视频在线观看| 99视频免费| 最近中文字幕mv免费高清视频8| 黄色网页网址在线免费| 精品资源在线看| 激情在线视频播放| 国产字幕在线看| 国产一卡2卡3卡免费网站| 国产鲁鲁视频在线观看特色| 日本欧洲一区| 免费午夜一级| 丁香婷婷在线观看| 午夜av电影| 中文岛国精品亚洲一区| heisi视频网在线观看| 狠狠综合久久久综合| 国产小视频免费在线观看| 国产不卡在线| www.色五月| 国产一区二区影视| 国产二级片在线| 欧美视频免费一区二区三区| 丁香花高清在线观看完整版| 天天操夜夜操天天射| 国产特级淫片免费看| 在线视频中文字幕第一页| 啪啪免费视频一区| 国产精品免费视频二三区| 在线视频观看国产| 午夜国产在线| 免费三级毛片| 国产va在线| 国内自拍视频在线观看| 国产9色视频| 国产专区在线播放| 影音先锋中文字幕在线| 最近中文字幕mv免费高清视频8| 香蕉视频在线观看www| **三级三级97片毛片| 中文日本在线观看|