原文作者:John McAliley,原文地址,翻譯:Pilipala
引用自:http://heikezhi.com/2011/11/15/創建你的第一個gem/
你在Ruby世界看到到處都是Gem。他們幾乎是所有的Ruby應用程序的核心。我承認當我試着建立第一個Gem的時候,我有點戰戰兢兢。但我很快 就發現了,這玩意簡單得要死。在這個博客系列中,我將涵蓋從頭開始創建一個Gem的基礎,然後轉移到更高級的主題,包括Gem生成工具和Rails引擎。 首先,對於你們這些Ruby有新手,第一個問題是:什麼是Gem?簡而言之,它是打包的Ruby代碼。在最低限度,Gem包括一個Ruby文件和一個 gemspec。gemspec(Gem規範)描述Gem信息,RubyGems包管理器需要這些信息安裝Gem。
RubyGems包管理器可以下載,並安裝Gem到你的系統,並允許你在其他Ruby程序中使用這些Gem。Ruby 1.9默認安裝RubyGems。如果你使用的是Ruby 1.9之前的版本,你可以在這裏下載RubyGems。在Ruby 1.9之前版本的應用程序中使用RubyGems,你需要在你的應用程序,加入這一行 :
require 'rubygems'
Ruby 1.9中不需要這麼做,因爲RubyGems已經被包含在Ruby 1.9中。
Gem規範(Gem Specification)
正如我在前面提到,Gem的規範描述了Gem。讓我們看看一個基本的gemspec文件:
- Gem::Specification.new do |s|
- s.name = %q{my_gem}
- s.version = "0.0.1"
- s.date = %q{2011-09-29}
- s.summary = %q{my_gem is an awesome gem}
- s.files = [
- "Gemfile",
- "Rakefile",
- "VERSION",
- "lib/my_gem.rb"
- ]
- s.require_paths = ["lib"]
- end
gemspec是一個相當簡單的文件,描述你的Gem的各個方面。在上面的例子gemspec中的文件中,我只列出必需的屬性。
前4個屬性是不言自明。“文件”屬性中列出包括在Gem中的所有文件。
“require_paths”屬性指定的目錄,其中包含Ruby文件應該被這個Gem所加載。gemspec所用到的完整屬性列表,請參考這裏。
這是一些簡單的基礎知識,現在讓我們切入正題,尋找更有趣的東西。
從頭開始創建一個Gem
1、建立Gem的基本文件結構:
輸入shell指令,並創建Gem需要的目錄:
$ mkdir awesome_gem $ cd awesome_gem $ mkdir lib
就這樣!你需要爲你的Gem和一個lib目錄來存放你的Ruby文件的根目錄。
2、創建的gemspec
我們將使用上一節gemspec文件作爲模板。創建一個名爲“awesome_gem.gemspec”在你的Gem的根目錄中。然後添加一些代碼,以成爲一個有效的gemspec:
- Gem::Specification.new do |s|
- s.name = %q{awesome_gem}
- s.version = "0.0.0"
- s.date = %q{2011-09-29}
- s.summary = %q{awesome_gem is the best}
- s.files = [
- "lib/awesome_gem.rb"
- ]
- s.require_paths = ["lib"]
- end
這個文件包含了一個gemspec標準所需的屬性,並且顯示我們有一個“lib”目錄。在lib目錄中的文件“awesome_gem.rb”將被用來保存這個Gem的Ruby代碼。
3、添加一些代碼
爲了簡單起見,我們將只用一個Ruby文件在這個Gem裏:/lib/awesome_gem.rb,你會看到這種結構類型在大多數你遇到的Gem 中。 “lib”內的根文件通常會與Gem的名稱相匹配。本例中,“awesome_gem”和“/lib/awesome_gem.rb” 。
繼續創建這個文件,添加下面的代碼:
- module AwesomeGem
- class WhoIs
- def self.awesome?
- puts "YOU ARE AWESOME!!"
- end
- end
- end
這雖然不是什麼改變世界的代碼,至少, awesome? 方法讓你感覺不錯。這個Gem將允許你在其他Ruby程序裏面使用 WhoIs 的類方法awesome?。
正如我在第一部分中提到,RubyGems的將安裝Gem在你的應用程序中,並使用Gem中的類。
4、生成的Gem文件
現在,你有一些很棒的代碼,你將要創建一個Gem,所以你可以在另一個Ruby程序用這些代碼。RubyGems提供命令,讓你創建一個Gem。輸入下面命令在Gem的根目錄:
$ gem build awesome_gem.gemspec
此命令將建立Gem和輸出Gem文件,將包括版本號在文件名中。由於gemspec中版本屬性的值是“0.0.0”,Gem的文件將被命名爲awesome_gem-0.0.0。
你應該看到下面的輸出和對一些缺少的屬性警告:
Successfully built RubyGem Name: awesome_gem Version: 0.0.0 File: awesome_gem-0.0.0.gem
你可以忽略這些警告,繼續在系統上安裝這個Gem。請注意,Gem文件被創建在當前目錄中。
5、安裝Gem
現在,你有一個Gem文件,你可以使用RubyGems安裝這個Gem到你的計算機上。通常情況下,你安裝的Gem來源於外部,但不限於此。如果你 有機會得到Gem文件,你可以通過指定Gem文件的位置將其安裝在本地。下面的命令在本地安裝awesome_gem.gem:
gem install awesome_gem.gemspec
你應該得到以下輸出:
Successfully installed awesome_gem-0.0.0 1 gem installed Installing ri documentation for awesome_gem-0.0.0... Installing RDoc documentation for awesome_gem-0.0.0...
耶!你剛創建了Gem!這個Gem現在已經安裝在你的系統,並準備在另一個Ruby程序中使用。
6、Gem的另一個Ruby程序
創建一個新的Ruby文件將用來測試我們的Gem。讓我們叫它“be_awesome.rb”。你可以在你的系統中的任何位置創建此文件,然後添加 下面的代碼,所以我們可以使用Gem中的“awesom?”類方法。用 require “awesome_gem”,RubyGems將能夠找到Gem,把這個類提供給你的程序。然後你只需要調用它。以下是代碼:
- require 'awesome_gem'
- AwesomeGem::WhoIs.awesome?
現在你可以運行Ruby程序和測試你新創建的Gem,看看你是如何awesome的。通過命令行輸入:
ruby be_awesome.rb
你應該看到在你的shell下面的輸出:
YOUR ARE AWESOME!
恭喜你,你只要在程序中使用你的新的Gem!雖然它還不值得放在GitHub上,跟朋友吹噓,但是, 你還是學會了如何從頭開始創建一個Gem,並在另一個程序中使用它。現在,你可以繼續前進,追求更大的進步。
結論
雖然本教程是相當簡單,只涉及創建一個基本的Gem,我認爲它對新的Gem開發者仍然很重要。
基礎知識給你一個進入高級的主題良好基礎。平時,我用Jeweler去創造Gem,這的確是一個功能強大的工具, 但我覺得手工從頭創建一個Gem之前就用這樣的生成工具,可能是有害的。
你需要了解如何構建一個Gem的最簡單的形式,纔可以理解像Jeweler這樣的生成工具的背後是什麼。雖然我建議在你第一次學習Gem開發時,手工從頭創建一個Gem。但是,當你理解了基礎知識,就沒什麼理由拒絕使用生成器了。
生成器可以節省很多時間,因爲他們給你一個很好的起始架構。本系列的下一個博客後,將有關Gem的開發,以及更高級的主題,諸如:如何使用生成工具來開始你的Gem開發。以後的文章將解釋如何開發Ruby on Rails的Gem。