聚集過來孩子們 讓爺爺講述舊日子的方式 當生活艱難 安裝 gems 是一場令人頭痛、拔髮、咬牙切齒的磨難
回到我剛開始學 Ruby 時 沒有 Bundler gems 必須用 hard way 安裝 在 Rails 中 這意味著運行 rake gems:install 一百萬次 一邊修復發生的 bugs 一邊直到命令通過且無錯誤 今天 我們將用老派方式創建一個 gem 在看看 gems 是什麼和它們如何工作之後
Gems, What Are They?
RubyGems 是一個簡單的方式用你自己的代碼擴展功能 由其他人編寫 例如 不用寫自己的 authentication/authorization code 你可以用 Devise 或者如果你想 resize 上傳的圖片 你可以用 CarrierWave 這允許你寫可重用的代碼 你可以與他人分享
But How Do They Work?
在其最基本形式中 一個 gem 只是一個包含代碼和 <name>.gemspec 文件的 zipped-up directory 這個 .gemspec 文件包含關於 gem 的 metadata 如其名稱 要加載哪些文件 和它的 dependencies
gem install 或 bundle 命令從 source 下載 zip 文件並將其解壓到你的硬盤 你可以通過運行 bundle info <gem name> 或直接通過運行 bundle open <gem name> 打開 gem directory 找出 gem 位於哪裡
為了將 gem 載入你的應用程序 Rubygems monkey-patches require function 在 Kernel 類中 它首先嘗試從磁盤讀取文件 如果那不起作用 它然後嘗試在你系統上的每個 gem 中解析文件 一旦它在 gem 中找到文件 它 "activates" gem 通過將其添加到 load path
如果你使用 Bundler 它在 setup 調用期間將每個特定 gem 添加到 load path 這節省了 Rubygems 嘗試解析路徑的麻煩 它還防止 Ruby 加載 Gemfile(.lock) 中選擇的不同版本的 gem
How Can I Make One?
創建你自己的 gem 最簡單的方法是使用 Bundler 生成 gem scaffold 這包括適當的目錄結構 license, code of conduct 和 gem 的 test environment
然而 今天 我們將創建我們自己的 minimalistic gem 只有兩個文件 一個包含代碼 和一個包含 metadata 的 gemspec 文件 我們的 gem 將在被調用時 greet user 讓我們開始創建一個目錄給我們的 gem
mkdir howdy
cd howdy
在這個目錄中 我們將創建一個 lib 資料夾包含代碼 和一個 howdy.gemspec 文件包含 metadata 它看起來應該像這樣:
tree .
├── howdy.gemspec
└── lib
└── howdy.rb
我們的 howdy gem 有以下代碼:
lib/howdy.rb
class Howdy
def greet
"howdy!"
end
end
一個 minimalistic howdy.gemspec 文件包含關於 version, author 等的信息 它還指定構建 gem 時要保留的文件 這防止 gem 用戶必須下載不必要的文件 如測試和其他運行 gem 代碼不需要的文件
Gem::Specification.new do |spec|
spec.name = "howdy"
spec.version = "0.0.1"
spec.authors = ["Robert Beekman"]
spec.email = ["robert@example.com"]
spec.summary = %q(Greets the user)
spec.description = %q(Howdy is a gem that greets the user when called)
spec.license = "MIT"
spec.files = ["lib/howdy.rb"]
end
為了 build gem 我們可以使用 gem build howdy.gemspec 命令 它生成一個包含你代碼的 howdy-0.0.1.gem 文件 為了使 gem 可供他人使用 你可以用 gem publish 命令發布到 rubygems.org
Recap
這些是創建和發布非常基本的 gem 所需的步驟 我們希望你享受我們深入 gems 的考古學 和老派製造它們的方式 如前所述 這是為了教育目的 我們建議在今天的世界使用 Bundler 生成 gem scaffold
Peace out, youngsters! 如果你有任何 ideas, questions 或 comments 請不要猶豫讓我們知道