Rubygems 套件管理工具

(本篇的對象是 Library 開發者,如果您是單純的 Library 使用者,可以先參考 RubyGems 簡介)

套句流行的話,RubyForge Must Die!! 大概是今年二月底的事情 (外電報導簡中翻譯),新的 gemcutter.org 取代了 rubyforge.org,目前已經成為 Ruby 社群的官方 Gem 儲存庫:rubygems.org,包括 gems.rubyforge.org 也是指向 rubygems.org

RubyForge.org 最大的問題之一,就是他不是用 Ruby 寫的(無誤),而新的 rubygems.org,使用了 Rails 當做前台,以及 Sinatra 當做 Gem server,背後技術包括 delayed::job 跟 Amazon S3 來處理所有上傳的 Gem package,讓發佈 Gem 的速度也大大提昇。整個站甚至也 open source 出來在 github.com/qrush/gemcutter。問題之二,就是 RubyForge 的介面實在不怎麼樣,功能也雜亂,而新 rubygems.org 有著全新的簡潔介面,提供具有親和力的資訊。問題之三,就是 API 了,新的 rubygems.org 配合新版的 rubygems library (1.3.6以上,如果你還沒升級,請打 sudo gem update –system),讓發佈 Gem 變得非常簡單。

還有個插曲,之前 github.com 有一度可以支援當做 Gem server,不過自從 gemcutter 計畫展開之後,他們就決定取消這個功能,請見 hasmygembuiltyet.org

如何打包及發佈 Gem

說到發佈 Gem 啊,我一直以為是有點麻煩的事情,最早我曾經用過 Hoe,也看過 jeweler 這個工具。不過一直到前一陣子看了 Yehuda 的 Using .gemspecs as Intended 這篇文章之後,才發現其實很簡單,根本不需要用到其餘的工具啊,那到底要怎麼做呢?

首先,我們要把你的 library 打包成一個 Gem package,假設我們的 library 叫 foobar 好了:

步驟一: 撰寫 foobar.gemspec 檔,這是一個描述 Gem package 的 metadata 檔案。以下是一個基本夠用的範例。如同 Yehuda 所說的,你其實不需要用其他的工具來產生這個 gemspec 檔案。

 

 Gem::Specification.new do |s|
  s.name        = "foobar"
  s.version     = "1.1.1"
  s.date        = "2010-05-14"
  s.authors     = ["Wen-Tien Chang"]
  s.email       = ["[email protected]"]
  s.homepage    = "http://example.org"
  s.summary     = "blah"
  s.description = "blah blah"
 
  # s.add_dependency('log4r', '>= 1.0.5')
  # s.add_dependency('log4r', '~> 1.1.0') # 表示 1.1.y 都可以 
  # s.add_dependency('log4r', '~> 1.0') # 表示 1.x.y 都可以 
  # s.add_runtime_dependency # add_dependency 的別名
  # s.add_development_dependency # 只有在 gem install xxx --development 才會安裝
   
  s.files = Dir.glob("{lib}/**/*") + %w(LICENSE README) # 只有列在這裡的檔案會打包到 Gem package 裡面。
  # s.executables = [] # 放在 bin 下的執行檔有哪些
end

Update1: 這裡有另一個範例參考 Be awesome: write your .gemspec yourself
Update2: Bundler 也可以產生空的 Gem,如果想讓 library 也用 bundler 管理 gem dependencies 可以考慮Developing a RubyGem using Bundler

更多完整的規格請參考 docs.rubygems.org/read/chapter/20

步驟二:執行 gem build foobar.gemspec 便會包裝出單一 Gem package 套件檔 foobar-1.1.1.gem

這時候,你就可以透過 gem install foobar-1.1.1.gem 來安裝到自己的電腦了。如果跑 gem server 起來,別人也可以透過你的 gem server 安裝這個套件 (gem install GEMNAME –source http://your_gem_server_host:8808)。

接下來,怎麼發佈 Gem 到 rubygems.org 讓全世界的開發者都可以安裝你的大作呢? 在 Rubygems 1.3.6 之後已經內建有 gem push 功能:

步驟一:在 rubygems.org/ 註冊一個帳號,拿到 API key,加到 ~/.gem/credentials 裡。
步驟二:執行 gem push foobar-1.1.1.gem 就會發佈出去了

Ruby Library 最佳實務

Update: 可以參考 Ruby Packaging Standard, 0.5-draft

一個 Ruby library 的組成,大致都是這樣的:

* README
* lib 目錄和會被使用者 require 的檔案,例如 lib/foobar.rb
* test 目錄 (optional)
* example (optional)
* bin 目錄 (有執行檔的話)
* LICENSE

如果你沒什麼概念,可以看看 Ruby Best Practice 一書的第八章 Skillful Project Maintenance,作者講解了一個 Ruby Library Project 的組成,還有介紹到如何用 RDoc 跟 Rakefile。如果你比較初學,建議一看。

接著 Gem Packaging: Best Practices 這一篇非常值得一看,介紹一些最佳實務,像是:

1. 不要在你的 library 裡依賴 rubygems。例如 require ‘rubygems’、rescue Gem::Load、gem “foo” 等等都不要用
2. 因為 lib 這一層目錄會進 $LOAD_PATH,所以不要放不是要給終端使用者 require 的檔案在 lib 下 (而且命名也不要太 general,不然可能會跟其他 library 撞到名字),其他檔案用 module namespace 的方式放到 lib 的子目錄下。例如你看 github.com/nex3/haml 的 lib 下就只放了 haml.rb 跟 sass.rb。
3. 承上,在 foobar.rb 中如果要 require 其他檔案,不需要寫 File.dirname(__FILE__) ,直接 require “foo/bar” 就會 require lib/foo/bar.rb 這個檔案了。

如果你想繼續多了解一些故事,可以看看:

* Gemcutter(rubygems.org) 作者在 RubyConf 2009 的演講:Gemcutter: The Next Step in Gem Hosting 以及他的投影片 next.heroku.com/
* Yuhada 在 RubyConf 2009 的演講: Polishing Rubygems

Mac 推薦軟體 (2010~2011)

Update(2012/9): 有 2012 年版的 Mac 推薦軟體了
Update(2011/5): 新增 Sparrow、Twitter、iTerm2、Divvy、Flux。

好像每年都整理一次的推薦清單。最近趁換了顆 Intel SSD 硬碟,第一次重灌雪豹,跟去年的推薦軟體相比拿掉了不少 App (越來越清心寡欲了?),新進榜則有四位。(加 * 的是付費軟體)

  • Yahoo! KeyKey: 必備的中文輸入法
  • (2010新進榜) Chrome: 最近幾個月愛用的瀏覽器
  • SubEthaEdit * 協同編輯器,若同事也都用 Mac 超級推薦,可以多人同時(即時)編輯一份文件。當做一般文字編輯也非常順手。
  • iWork* : 包含投影片 Keynote、試算表 Numbers、文件編輯 Pages 三套軟體,也可以拿來開 Microsoft Excel、Word 也大多都可以順利開出來。
  • (2010新進榜) NOTATIONAL VELOCITY: 超級簡單的雲端記事本,最大的好處是可以跟 iPhone 的 Simplenote 同步
  • LittlleSnapper*: 抓網頁或螢幕的 screenshot 並加以管理、加註。
  • Skitch: 螢幕抓圖工具,更棒的這可以直接網路分享,非常方便可以當做溝通工具。
  • VMware Fusion*: 可以在 Mac 上跑其他作業系統,最常見的被迫需求情境是 Windows + IE 瀏覽器。
  • LaunchBar* : 鍵盤快速啟動應用程式的好物。不想花錢的話可以試試 QuickSilver
  • VLC 放影片
  • Pixelmator*: 影像編輯軟體,功能類似 Photoshop,但不用這麼貴… XD
  • Burn: 燒錄軟體
  • chicken of the VNC: VNC client
  • Adobe Reader
  • KKBOX*: 聽正版音樂,有出 Mac 版就甘心。
  • (2011新進榜)Sparrow*: Email 桌面軟體
  • (2011新進榜) DivvySizeUp* :
    透過快速鍵切割視窗畫面,可以很方便地安排左右視窗,適合大螢幕
  • (2011新進榜)Flux: 根據時間自動調整螢幕亮度

網路相關

  • (2010新進榜) Google Reader: 捨之前用的 NetNewsWire 主要的理由是我現在都用 iPhone 做第一次的 RSS 瀏覽(如果有興趣再加到 Instapaper),而大部分的 iPhone RSS reader 都支援跟 Google Reader 同步,例如我用 NewsRack
  • Nally: Mac 上最棒的 BBS 軟體
  • Panic Transmit*: Mac 上超棒的FTP軟體,好操作介面佳,還支援 Amazon S3。
  • Tweetie Twitter: Twitter 的桌面軟體,我會特別需要桌面版的 Twitter 軟體是因為我有多個帳號需求。
  • Adium: 整合msn/gtalk等的IM
  • Skype: 喂喂

系統管理

  • AppZapper*: 反安裝軟體,可以清比較乾淨
  • Growl 好玩的自動提示,可以吃其他應用軟體的訊息。
  • smcFanControl 手動控制風扇
  • OmniDiskSweeper: 磁碟清理工具,可以很方便地找出到底哪個檔案跟目錄是最佔空間
  • coconutBattery: 電池狀態查詢跟紀錄

程式開發

  • iTerm iTerm2: 支援多 Tab 的 Terminal,我主要拿來做 SSH 登入
  • Visor: 把 Mac 內建的 Terminal 改成透過熱鍵即可呼叫出來,我主要拿來下程式開發中的各種 script 指令
  • (2010新進榜) Homebrew: 套件管理工具,詳見這篇文章
  • Textmate * Rails Developer 都會有的一套編輯器,請進一步參考推薦安裝Plugins
  • GitX: Git GUI (有個 Fork 版有 sidebar 不錯)
  • Sequel Pro: MySQL 的 GUI
  • Navicat* : 比較專業的 MySQL GUI,覺得最方便的是支援 SSH 登入遠端操作資料庫(畢竟很少情況會開 3306 Port 可以遠端連線),另外處理編碼也很聰明,印象中很少看到出現亂碼。如果你有舊版本MySQL的編碼問題無法順利dump出來,可以試試。

網頁設計

Dashboard

Ruby Tuesday #12 開放報名

Ruby Tuesday 聚會的第十二場,照慣例有兩場演講:

  • ryudoawaru: Ruby on Discuz!-用Ruby擴充論壇的社群功能
  • ihower: Ruby Object Model & Meta-Programming

我的部份,主要是講上次準備好但時間不夠沒講到的 Designing Beautiful Ruby APIs: Part2 (p.58),如果你喜歡我在 RubyConf 的演講,歡迎繼續來聽下半場更進階的部分。

時間: 2010/5/18(週二)晚上七點到九點半。
地點: 台北市 果子咖啡
報名網頁: registrano.com/events/ruby-tuesday-12

校園自由軟體工作坊 – Meet Ruby on Rails

Update: 投影片下載:遇見 Ruby on Rails

這週三 (2010/5/5) 晚上我在台大有一場 “Meet Ruby on Rails” 的演講,是由 OSSF 和台大資工系學會所合辦的工作坊。

不同於上次在清大的校園課程,這次只有安排 talk,沒有安排電腦教室給學員實作。給大學生講這個題目,我目前想要多準備一點軟性題目,少談一點程式碼。像是介紹 Web 軟體開發產業、為什麼採用 Web framework、為什麼用 Rails? 為什麼用 scripting 動態語言? 為什麼用 Ruby? 以及除了學校課程以外,我認為作為一個 Web-based 軟體設計師,可以學習的方向。當然,還有 Rails 的 live demo。

某方面來說,雖然題目是遇見 Ruby on Rails,但是我希望也可以讓聽眾遇見 Web application 軟體開發的樂趣。台灣的資工系學生畢業之後,大部分都投入硬體相關產業吧 (不同於美國的軟體業產值超過硬體,台灣的軟體業產值只有硬體的九分之一,真是九牛一毛啊 :~ )。如果這場演講可以讓他們多了解 Web 軟體產業,無論是不是喜歡 Ruby 或 Rails (就算是喜歡上 Python, Perl 也不錯),那就達到我演講的目的了。

Homebrew: 新一代 OSX 套件管理工具

身為一個 programmer,總是需要在 Mac 上裝一些開放源碼程式,除了自己下載、編譯( ./configure && make && make install) 之外,通常最方便的選項就是用套件管理工具來處理安裝、升級跟移除。

Homebrew 之前,最常見的就是 MacPortsFink 了,我自己本來是用 MacPorts,它有個討厭的特點就是它不依賴系統內已經安裝好的套件,完全自成一局 (當然,這也算是一種 isolation 優點,如果你不爽的時候只要砍掉 /opt 就移掉了)。所以常常為了裝個小套件,就還要安裝一堆它依賴的套件(例如:重複裝一套你系統裡已經有的 Perl,crazy!),十分耗費時間跟空間,而且到最後我也搞不清楚它裝了一大堆我不知道拿來幹什麼用的套件。

Homebrew 則盡量依賴系統內已經有的套件、它的套件 formula 是用簡單的 Ruby 寫的,所以你可以 fork Homebrew repository 自行修改維護、它自己用 Git 管理自己,升級十分方便。

安裝及使用方式

1. 要先安裝有 Xcode,你才能編譯東西。
2. 下載執行 gist.github.com/323731

安裝好之後,就有以下指令可以使用

brew search 搜尋套件
brew info 查詢套件資訊
brew list 已經裝了哪些套件
brew update 更新 homebrew 自己
brew install 安裝套件

例如,我馬上就安裝了 wgetgit 這兩個是我最基本要用的工具,一下就搞定了,cool!

brew install wget
brew install git

參考資料

homebrew — Mac OS X 下新的软件包管理工具
Homebrew: OS X’s Missing Package Manager