構(gòu)建一個(gè) Ruby Gem 第一章 簡(jiǎn)介

在我們開(kāi)始之前先做一下后勤工作……這本書(shū)假定你可以舒服的編寫(xiě) Ruby 代碼窥摄。如果不是這種情況励负,不用擔(dān)心……有很多書(shū)和代碼可以幫助你捶牢。你只要知道,這里有一些主題會(huì)深入一些更復(fù)雜的話題比如 Ruby 加載模式和命名空間遗淳。

就我個(gè)人而言,通過(guò)例子學(xué)習(xí)是最好的學(xué)習(xí)方式心傀。我發(fā)現(xiàn)的最有價(jià)值的書(shū)和文章都會(huì)在涉及到一個(gè)話題后立刻展示真正的代碼洲脂。我會(huì)在適當(dāng)?shù)那闆r下也這樣做。我也會(huì)不留余力的從流行的 Ruby gems 中對(duì)比和高亮代碼只要這是有意義的剧包。我所希望的是這些 gems 可以給你提供些靈感并且最后展示給你看如何讓你的想法可以被轉(zhuǎn)化成可以工作的 Ruby gems恐锦。

讓我們以這種方式開(kāi)始吧……

什么是一個(gè) gem?

一個(gè) Ruby gem 是一個(gè)可以復(fù)用的打包好的 Ruby 應(yīng)用程序或者類(lèi)庫(kù),它專注于特定的功能疆液。Ruby gems 可以做很多事情比如和 Twitter 交互一铅,構(gòu)建 web 應(yīng)用程序,或者管理后臺(tái)任務(wù)堕油,等等潘飘。

Rubygems.org 是一個(gè)被社區(qū)認(rèn)可的 Ruby gems 的托管站點(diǎn)。如果你用 Rails 工作過(guò)掉缺,你很可能用過(guò) bundle install 命令來(lái)安裝在一個(gè) Gemfile 列表中 gems卜录。在大多數(shù)情況下,它們是從 Rubygems.org 被下載和安裝的眶明。

對(duì)于 Ruby 來(lái)說(shuō)很幸運(yùn)的是艰毒,它的開(kāi)源社區(qū)是強(qiáng)而廣泛的。對(duì)于一個(gè)普通的應(yīng)用需要的一個(gè)小功能很少會(huì)不能找到已有的 gem 去引用搜囱。然而丑瞧,不要因?yàn)檫@種情況阻礙了你構(gòu)建下一個(gè)偉大的 gem。

為什么構(gòu)建一個(gè) gem?

拿 Twitter 來(lái)舉例……如果我們寫(xiě)了 3 個(gè)不同的應(yīng)用都需要發(fā)一條推文作為一個(gè)用戶行為的結(jié)果蜀肘,把那些發(fā)送推文的代碼寫(xiě)在 3 個(gè)不同的地方是很操蛋的绊汹。即使只寫(xiě)一次然后復(fù)制/粘貼到每個(gè)應(yīng)用中也是很容易出錯(cuò)的。提取這些代碼到一個(gè)新的 gem 是一件一勞永逸的事情扮宠。用這種方法西乖,我們的應(yīng)用會(huì)得到同一組方法和功能。但是不要擔(dān)心坛增,這個(gè) Twitter 的 gem 已經(jīng)被寫(xiě)好了获雕,所以我們又少做了一件事!

一種更加復(fù)雜的情況牽涉到把一個(gè)龐大的應(yīng)用拆分為微服務(wù)(由更小的致力于特定的功能的應(yīng)用組成)。我們可以考慮這樣做如果我們的應(yīng)用程序變得龐大并且獨(dú)立的組件開(kāi)始變得越來(lái)越復(fù)雜轿偎。服務(wù)的基本原則和管理超出了本書(shū)的范圍典鸡,但是我想說(shuō)被廓,還有一些其他理由讓我們從我們的應(yīng)用程序中提取代碼到 gems 中坏晦。

我寫(xiě)了關(guān)于在我的應(yīng)用中最流行的 ruby gems,再次看看這個(gè)列表, 我從這些 gems 的中得到的好處是巨大的。這是為什么使用 rails 構(gòu)建 web 應(yīng)用能讓你快速迭代一個(gè)原因昆婿。

根據(jù) Rubygems.org 的數(shù)據(jù), 從 2009年7月開(kāi)始已經(jīng)有 66,783個(gè) gems 被創(chuàng)建了球碉,一共被下載了幾乎 24 億次。有大量的下載和大量的 gems仓蛆!開(kāi)源世界是對(duì)于 Ruby gems 和你的 ruby 應(yīng)用程序都是一個(gè)很好的地方睁冬。花一些時(shí)間來(lái)簡(jiǎn)化你的應(yīng)用并且讓其他人能從你的的代碼中獲益看疙,通過(guò)創(chuàng)建一個(gè)開(kāi)源的 Ruby gem豆拨。

公開(kāi)或私有?


我們將要構(gòu)建的 Ruby gem (作為本書(shū)的一部分) 是開(kāi)源的。然而能庆,正如上面提到的施禾,有些情況下把一個(gè)大的應(yīng)用拆分成小的 gems 是一個(gè)好主意,在這種情況下搁胆,把這些小的 gem 作為你組織的私有 gem 是完全合理的弥搞。Github 使得創(chuàng)建私有代碼倉(cāng)庫(kù)很簡(jiǎn)單所以你的代碼是被保護(hù)的。

(好的)例子是很難的

很難去創(chuàng)建一個(gè)不無(wú)聊并且有價(jià)值的例子渠旁。那我們?cè)搫?chuàng)建什么呢攀例?!顾腊?粤铭!

這本書(shū)的第一個(gè)部分將會(huì)專注于一個(gè)簡(jiǎn)單的 Ruby gem,它不會(huì)比決定文件結(jié)構(gòu)和加載依賴更有趣杂靶。雖然這不會(huì)是你見(jiàn)過(guò)的最復(fù)雜的 ruby 代碼承耿,但我希望這個(gè)例子會(huì)足夠用來(lái)展示從開(kāi)始到完成一個(gè) Ruby gem 的構(gòu)建的必備步驟。

MegaLotto

我們會(huì)從一個(gè)創(chuàng)建隨機(jī)彩票號(hào)碼的叫做 MegaLotto 的 gem 開(kāi)始伪煤。

MegaLotto 有兩個(gè)特性:

  1. 它返回了一個(gè)包含 5 個(gè) integer 的數(shù)組
  2. 數(shù)組的每個(gè)元素必須是一個(gè) 0 到 60 之間的隨機(jī)數(shù)(不包含 0 和 60 )

這里是兩個(gè)符合要求的例子:

[23, 22, 3, 7, 16]
[13, 20, 26, 1, 9]

接下來(lái)的章節(jié)的重點(diǎn)將會(huì)是我們構(gòu)建一個(gè) Ruby gem 的結(jié)構(gòu)和步驟加袋,和有少量 gem 自己的功能。

總結(jié)

希望我們現(xiàn)在構(gòu)建一個(gè) Ruby gem 的原因和我們這樣做能得到的好處是很清楚的抱既。

Stephan Hagemann 在 MountainWest RubyConf 的一個(gè)演講叫做 Component-based Architectures in Ruby and Rails职烧。這是我所見(jiàn)過(guò)的最好的關(guān)于在你已有的應(yīng)用中提取類(lèi)庫(kù)的演講。Stephan 的演講從為什么你應(yīng)該要從一個(gè) Rails 應(yīng)用程序中提取代碼到你這樣做會(huì)需要的特定方法和步驟都有涉及防泵。我強(qiáng)烈建議你觀看這個(gè)視頻如果你從事大型 Rails 應(yīng)用的開(kāi)發(fā)蚀之。

如果和我一樣,你大概已經(jīng)在想了捷泞,『好了足删,快讓我們看看代碼!』锁右。你是對(duì)的……下一章將會(huì)討論一個(gè) gem 的結(jié)構(gòu)然后我們會(huì)開(kāi)始我們的杰作 —— MegaLotto失受!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末讶泰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拂到,更是在濱河造成了極大的恐慌痪署,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兄旬,死亡現(xiàn)場(chǎng)離奇詭異狼犯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)领铐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)悯森,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人绪撵,你說(shuō)我怎么就攤上這事呐馆。” “怎么了莲兢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵汹来,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我改艇,道長(zhǎng)收班,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任谒兄,我火速辦了婚禮摔桦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘承疲。我一直安慰自己邻耕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布燕鸽。 她就那樣靜靜地躺著兄世,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啊研。 梳的紋絲不亂的頭發(fā)上御滩,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音党远,去河邊找鬼削解。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沟娱,可吹牛的內(nèi)容都是我干的氛驮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼济似,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼矫废!你這毒婦竟也來(lái)了盏缤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤磷脯,失蹤者是張志新(化名)和其女友劉穎蛾找,沒(méi)想到半個(gè)月后娩脾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赵誓,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年柿赊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俩功。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碰声,死狀恐怖诡蜓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胰挑,我是刑警寧澤蔓罚,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站瞻颂,受9級(jí)特大地震影響豺谈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贡这,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一茬末、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盖矫,春花似錦丽惭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至湃望,卻和暖如春拷橘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喜爷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工冗疮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人檩帐。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓术幔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親湃密。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诅挑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容