What is Gem
RubyGems 是 Ruby 的 Package 管理系統。它的作用類似 Linux 系統下的 apt-get 或者是 yum。不同的是:RubyGems 是提供「打包」好的 Ruby Library 讓開發者能夠重複利用別人已造好的輪子,提高開發效率。
而目前 Rails 3.0+ 起,幾乎都也推薦使用 RubyGems 的方式,將 Plugin 打包成 Gem 的方式搭配 Bundler 使用。
打包 Gem
隨著時代進步,打包和發佈 Gem 的方式一直在進步。
最早以前大家都是手工製造 ( RailsCast #135 ),後來 Jeweler( RailsCast #183 ) 被發明出來,讓打包變得非常容易。
而到最後,更演變成了 Bundler 內建 ( Rails 245 )。
包裝一個 Gem 變得越來越容易。
Gem 的基本結構
若以 Bundler 內建的指令 bundle gem GEM_NAME
自動生出來的檔案。其實 Gem 的結構也相當簡單。
-
Gemfile
# 描述 dependency -
Rakefile
# 發佈和打包的 rake tasks -
GEM_NAME.gemspec
# gem 的 spec -
GEM_NAME/lib/GEM_NAME.rb
與GEM_NAME/lib/GEMNAME/
# gem 裡的 library -
GEM_NAME/lib/GEM_NAME/version.rb
# 版本紀錄
主要的 Library 需放置在 lib/ 底下。
若需使用到相依套件的話,需在 Gemfile 以及 .gemsepc 定義。
Bundler 提供的基本 Task
Bundler 基本上算是提供半自動的打包,只提供非常基本的三個 Task:
-
rake build
# Build my_plugin-0.0.1.gem into the pkg directory -
rake install
# Build and install my_plugin-0.0.1.gem into system gems -
rake release
# Create tag v0.0.1 and build and push my_plugin-0.0.1.gem to Rubygems
Jeweler
若你有更多懶人需求,不妨 check Jeweler 這個 gem,它提供了更多 rake tasks 讓打包更加方便。
Best Practices
Rails Core Team member 「Josh Peek」曾經在 Rails 官方 blog 寫過一篇文章 Gem Packaging: Best Practices 講解如何寫出比較乾淨正確的 Gem。
如何在專案中使用開發中的 gem
以往的想法可能都是打包之後,在 local 安裝開發中的 gem 版本,或者是直接先放在 vendor/plugins 中測試。在有了 Bundler 的時代其實不需要這麼麻煩。
只要在 Gemfile 內加入這樣一行
就可以引用開發中的 gem,等到真的開發完。再換成 git repo 或 rubygems.org 上的版本。
=====
現在我每週都固定有在回答一些問題,發現不少人對 Ruby / Rails 的一些疑惑,都大同小異。這些問題有一些我有寫過文件但沒有公開披露,有一些沒有寫過文件但有答案。所以順手把這些回答過的答案整理到 blog 上讓大家參考。
如果你在 Ruby / Rails 在使用有任何問題,都歡迎貼到 http://ruby-taiwan.org。