最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

寫一個漂亮Rakefile的方法

 更新時間:2014年06月04日 09:10:43   作者:  
這篇文章主要介紹了寫一個漂亮Rakefile的方法,文中主要就是寫一個類,繼承自 Tasklib,然后在這個類的初始化函數(shù)里用 task 或者 file 來定義實際完成任務(wù)的子 task 即可,需要的朋友可以參考下

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")

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

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

具體地來說,就是寫一個類,繼承自 Tasklib (雖然實際上只是約定而并不是必須的),然后在這個類的初始化函數(shù)里用 task 或者 file 來定義實際完成任務(wù)的子 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 相關(guān)的屬性,在初始化函數(shù)里設(shè)置初值,然后調(diào)用 block 來填充實際的值,最后調(diào)用 define 函數(shù),define 函數(shù)就使用 directory 、file 和 task 分別定義了建立目錄、編譯和清理的任務(wù)。如果了解 Ruby 和 Rake 的基本語法的話,應(yīng)該很容易看明白了。

接下來把這個文件保存到某個 .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 里找到的感覺??!

相關(guān)文章

  • Ruby On Rails上手筆記(安裝使用全過程)

    Ruby On Rails上手筆記(安裝使用全過程)

    有機會再試一試Rails了,只是原來接觸的是2,現(xiàn)在已然變成了4,似乎現(xiàn)在的安裝比原來會快些。
    2014-05-05
  • Ruby中百分號和字面值的使用示例

    Ruby中百分號和字面值的使用示例

    這篇文章主要介紹了Ruby中百分號和字面值的使用示例,作者給出了相關(guān)編程風格上的一些建議,需要的朋友可以參考下
    2015-08-08
  • Ruby多線程編程初步入門

    Ruby多線程編程初步入門

    這篇文章主要介紹了Ruby多線程編程初步入門,線程是Ruby編程學習當中的重點和難點,需要的朋友可以參考下
    2015-05-05
  • rails "No route matches" 錯誤的解決方法

    rails "No route matches" 錯誤的解決方法

    有時候 rails 會出現(xiàn)
    2008-12-12
  • Ruby中Hash哈希結(jié)構(gòu)的基本操作方法小結(jié)

    Ruby中Hash哈希結(jié)構(gòu)的基本操作方法小結(jié)

    Hash是一種鍵值對應(yīng)的數(shù)據(jù)結(jié)構(gòu),Ruby中直接帶有Hash類來對其提供支持,這里我們整理了Ruby中Hash哈希結(jié)構(gòu)的基本操作方法小結(jié),首先來回顧一下Hash的基本知識:
    2016-06-06
  • ruby開發(fā)的交互式程序例子

    ruby開發(fā)的交互式程序例子

    這篇文章主要介紹了ruby開發(fā)的交互式程序例子,本文使用ripl實現(xiàn),需要的朋友可以參考下
    2014-07-07
  • win7安裝ruby on rails開發(fā)環(huán)境

    win7安裝ruby on rails開發(fā)環(huán)境

    看到很多文章都說ruby環(huán)境在windows上是非常難搭建,會出現(xiàn)各種各樣的怪問題,所以都推薦到linux和mac上安裝開發(fā)。但是我按照教程搭了下,問題也不算太多??傔^大概花費了2個半小時左右就完成了。下面就把安裝的步驟及具體的版本記錄了一下供大家參考。
    2014-07-07
  • 實例解析Ruby中的數(shù)值類型以及常量

    實例解析Ruby中的數(shù)值類型以及常量

    這篇文章主要介紹了Ruby中的數(shù)值類型以及常量,是Ruby入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • CentOS7下搭建ruby on rails開發(fā)環(huán)境

    CentOS7下搭建ruby on rails開發(fā)環(huán)境

    聽說rails是一個比較流行的快速開發(fā)框架,對于我這個web不熟悉的人來說,那是極好的!可以快速上手,又能真正了解服務(wù)器端的各種,所以rails搞起來。不過一個完整的開發(fā)環(huán)境搭建過程完成后,真的只能用各種坑來形容~
    2016-02-02
  • Ruby中執(zhí)行Linux shell命令的六種方法詳解

    Ruby中執(zhí)行Linux shell命令的六種方法詳解

    這篇文章主要介紹了Ruby中執(zhí)行Linux shell命令的六種方法詳解,這些方法包括exec、system、反引號、IO、Open3、Open4等命令,需要的朋友可以參考下
    2015-01-01

最新評論

武乡县| 武汉市| 盐亭县| 炉霍县| 布拖县| 义马市| 太湖县| 星座| 哈密市| 永昌县| 永寿县| 宁强县| 商水县| 四平市| 永胜县| 宜黄县| 江华| 南漳县| 广西| 襄樊市| 靖远县| 苍溪县| 曲阳县| 义马市| 开远市| 井陉县| 林口县| 石渠县| 扎囊县| 沧州市| 临颍县| 平乐县| 永善县| 五台县| 龙井市| 和平县| 贵州省| 青海省| 西畴县| 大足县| 万宁市|