如何寫一個 gem?

1: 生成一個新的 gem

bundle gem gem_name

其中 gem_name 可以替換成你想要的名字

2: 編輯 gem_name.gemspec

把 gem_name.gemspec 當中所有的 TODO 都填好

3: Test

可以進入已經載入 gem 的 irb 做一些測試

./bin/console

4: Build

git add .
gem build gem_name.gemspec

會生成一個 gem_name-0.1.0.gem 檔案

5: 發布

gem push gem_name-0.1.0.gem

就完成了!

注意事項

關於

gem build gem_name.gemspec

預設 gemspec 會有這段 code:

  # Specify which files should be added to the gem when it is released.
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
  spec.files         = Dir.chdir(File.expand_path('..', __FILE__)) do
    `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
  end

所以在 build 的時候,gemspec 會挑選出在 git 管理之下檔案,所以如果你建立了一個新檔案但是沒有 git add . 的話,是無法被打包進入 gem 內的。

Gem::InvalidSpecificationException

另外,如果 build 好的 .gem 檔案也在 git 管理之下時,會無法 build 成功,因為不該把 .gem 包進 .gem 內。

WARNING:  See http://guides.rubygems.org/specification-reference/ for help
ERROR:  While executing gem ... (Gem::InvalidSpecificationException)
    gem_name-0.1.0 contains itself (gem_name-0.1.0.gem), check your files list

如果你只是單純刪除 .gem 檔,就重試 build 指令的話,你會看到

WARNING:  See http://guides.rubygems.org/specification-reference/ for help
ERROR:  While executing gem ... (Gem::InvalidSpecificationException)
    ["fake_chatbot-0.1.0.gem"] are not files

results matching ""

    No results matching ""