原文作者:John McAliley,原文地址,翻譯:Pilipala
你在Ruby世界看到到處都是Gem。他們幾乎是所有的Ruby應(yīng)用程序的核心。我承認(rèn)當(dāng)我試著建立第一個(gè)Gem的時(shí)候,我有點(diǎn)戰(zhàn)戰(zhàn)兢兢。但我很快就發(fā)現(xiàn)了,這玩意簡(jiǎn)單得要死。在這個(gè)博客系列中,我將涵蓋從頭開(kāi)始創(chuàng)建一個(gè)Gem的基礎(chǔ),然后轉(zhuǎn)移到更高級(jí)的主題,包括Gem生成工具和Rails引擎。首先,對(duì)于你們這些Ruby有新手,第一個(gè)問(wèn)題是:什么是Gem?簡(jiǎn)而言之,它是打包的Ruby代碼。在最低限度,Gem包括一個(gè)Ruby文件和一個(gè)gemspec。gemspec(Gem規(guī)范)描述Gem信息,RubyGems包管理器需要這些信息安裝Gem。
RubyGems包管理器可以下載,并安裝Gem到你的系統(tǒng),并允許你在其他Ruby程序中使用這些Gem。Ruby 1.9默認(rèn)安裝RubyGems。如果你使用的是Ruby 1.9之前的版本,你可以在這里下載RubyGems。在Ruby 1.9之前版本的應(yīng)用程序中使用RubyGems,你需要在你的應(yīng)用程序,加入這一行 :
require 'rubygems'
Ruby 1.9中不需要這么做,因?yàn)镽ubyGems已經(jīng)被包含在Ruby 1.9中。
Gem規(guī)范(Gem Specification)
正如我在前面提到,Gem的規(guī)范描述了Gem。讓我們看看一個(gè)基本的gemspec文件:
gemspec是一個(gè)相當(dāng)簡(jiǎn)單的文件,描述你的Gem的各個(gè)方面。在上面的例子gemspec中的文件中,我只列出必需的屬性。
前4個(gè)屬性是不言自明?!拔募睂傩灾辛谐霭ㄔ贕em中的所有文件。
“require_paths”屬性指定的目錄,其中包含Ruby文件應(yīng)該被這個(gè)Gem所加載。gemspec所用到的完整屬性列表,請(qǐng)參考這里。
這是一些簡(jiǎn)單的基礎(chǔ)知識(shí),現(xiàn)在讓我們切入正題,尋找更有趣的東西。
從頭開(kāi)始創(chuàng)建一個(gè)Gem
1、建立Gem的基本文件結(jié)構(gòu):
輸入shell指令,并創(chuàng)建Gem需要的目錄:
$ mkdir awesome_gem$ cd awesome_gem$ mkdir lib
就這樣!你需要為你的Gem和一個(gè)lib目錄來(lái)存放你的Ruby文件的根目錄。
2、創(chuàng)建的gemspec
我們將使用上一節(jié)gemspec文件作為模板。創(chuàng)建一個(gè)名為“awesome_gem.gemspec”在你的Gem的根目錄中。然后添加一些代碼,以成為一個(gè)有效的gemspec:
這個(gè)文件包含了一個(gè)gemspec標(biāo)準(zhǔn)所需的屬性,并且顯示我們有一個(gè)“l(fā)ib”目錄。在lib目錄中的文件“awesome_gem.rb”將被用來(lái)保存這個(gè)Gem的Ruby代碼。
3、添加一些代碼
為了簡(jiǎn)單起見(jiàn),我們將只用一個(gè)Ruby文件在這個(gè)Gem里:/lib/awesome_gem.rb,你會(huì)看到這種結(jié)構(gòu)類(lèi)型在大多數(shù)你遇到的Gem中。 “l(fā)ib”內(nèi)的根文件通常會(huì)與Gem的名稱(chēng)相匹配。本例中,“awesome_gem”和“/lib/awesome_gem.rb” 。
繼續(xù)創(chuàng)建這個(gè)文件,添加下面的代碼:
這雖然不是什么改變世界的代碼,至少, awesome? 方法讓你感覺(jué)不錯(cuò)。這個(gè)Gem將允許你在其他Ruby程序里面使用 WhoIs 的類(lèi)方法awesome?。
正如我在第一部分中提到,RubyGems的將安裝Gem在你的應(yīng)用程序中,并使用Gem中的類(lèi)。
4、生成的Gem文件
現(xiàn)在,你有一些很棒的代碼,你將要?jiǎng)?chuàng)建一個(gè)Gem,所以你可以在另一個(gè)Ruby程序用這些代碼。RubyGems提供命令,讓你創(chuàng)建一個(gè)Gem。輸入下面命令在Gem的根目錄:
$ gem build awesome_gem.gemspec
此命令將建立Gem和輸出Gem文件,將包括版本號(hào)在文件名中。由于gemspec中版本屬性的值是“0.0.0”,Gem的文件將被命名為awesome_gem-0.0.0。
你應(yīng)該看到下面的輸出和對(duì)一些缺少的屬性警告:
Successfully built RubyGemName: awesome_gemVersion: 0.0.0File: awesome_gem-0.0.0.gem
你可以忽略這些警告,繼續(xù)在系統(tǒng)上安裝這個(gè)Gem。請(qǐng)注意,Gem文件被創(chuàng)建在當(dāng)前目錄中。
5、安裝Gem
現(xiàn)在,你有一個(gè)Gem文件,你可以使用RubyGems安裝這個(gè)Gem到你的計(jì)算機(jī)上。通常情況下,你安裝的Gem來(lái)源于外部,但不限于此。如果你有機(jī)會(huì)得到Gem文件,你可以通過(guò)指定Gem文件的位置將其安裝在本地。下面的命令在本地安裝awesome_gem.gem:
gem install awesome_gem.gemspec
你應(yīng)該得到以下輸出:
Successfully installed awesome_gem-0.0.01 gem installedInstalling ri documentation for awesome_gem-0.0.0...Installing RDoc documentation for awesome_gem-0.0.0...
耶!你剛創(chuàng)建了Gem!這個(gè)Gem現(xiàn)在已經(jīng)安裝在你的系統(tǒng),并準(zhǔn)備在另一個(gè)Ruby程序中使用。
6、Gem的另一個(gè)Ruby程序
創(chuàng)建一個(gè)新的Ruby文件將用來(lái)測(cè)試我們的Gem。讓我們叫它“be_awesome.rb”。你可以在你的系統(tǒng)中的任何位置創(chuàng)建此文件,然后添加下面的代碼,所以我們可以使用Gem中的“awesom?”類(lèi)方法。用 require “awesome_gem”,RubyGems將能夠找到Gem,把這個(gè)類(lèi)提供給你的程序。然后你只需要調(diào)用它。以下是代碼:
現(xiàn)在你可以運(yùn)行Ruby程序和測(cè)試你新創(chuàng)建的Gem,看看你是如何awesome的。通過(guò)命令行輸入:
ruby be_awesome.rb
你應(yīng)該看到在你的shell下面的輸出:
YOUR ARE AWESOME!
恭喜你,你只要在程序中使用你的新的Gem!雖然它還不值得放在GitHub上,跟朋友吹噓,但是, 你還是學(xué)會(huì)了如何從頭開(kāi)始創(chuàng)建一個(gè)Gem,并在另一個(gè)程序中使用它?,F(xiàn)在,你可以繼續(xù)前進(jìn),追求更大的進(jìn)步。
結(jié)論
雖然本教程是相當(dāng)簡(jiǎn)單,只涉及創(chuàng)建一個(gè)基本的Gem,我認(rèn)為它對(duì)新的Gem開(kāi)發(fā)者仍然很重要。
基礎(chǔ)知識(shí)給你一個(gè)進(jìn)入高級(jí)的主題良好基礎(chǔ)。平時(shí),我用Jeweler去創(chuàng)造Gem,這的確是一個(gè)功能強(qiáng)大的工具, 但我覺(jué)得手工從頭創(chuàng)建一個(gè)Gem之前就用這樣的生成工具,可能是有害的。
你需要了解如何構(gòu)建一個(gè)Gem的最簡(jiǎn)單的形式,才可以理解像Jeweler這樣的生成工具的背后是什么。雖然我建議在你第一次學(xué)習(xí)Gem開(kāi)發(fā)時(shí),手工從頭創(chuàng)建一個(gè)Gem。但是,當(dāng)你理解了基礎(chǔ)知識(shí),就沒(méi)什么理由拒絕使用生成器了。
生成器可以節(jié)省很多時(shí)間,因?yàn)樗麄兘o你一個(gè)很好的起始架構(gòu)。本系列的下一個(gè)博客后,將有關(guān)Gem的開(kāi)發(fā),以及更高級(jí)的主題,諸如:如何使用生成工具來(lái)開(kāi)始你的Gem開(kāi)發(fā)。以后的文章將解釋如何開(kāi)發(fā)Ruby on Rails的Gem。
聯(lián)系客服