読者です 読者をやめる 読者になる 読者になる

みかづきメモ

学習したことのメモとか、日記とか、備忘録。

gem を作る

先日 Electron で遊ぶと言いつつ、ずっと rubygem を作っていました。
今後も作ることはあるかもしれないので、メモしておきます。


まず、雛形を作ります。

$ bundle gem new_gem --test

--test 付きで実行することで、テストの雛形も生成してくれます。
ついでに、 Git リポジトリを作ってくれてたり、 .gitignore もあったりと、
とってもいい感じです。

次に、 new_gem.gemspec を変更します。 生成直後はこんな感じ。

# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'new_gem/version'

Gem::Specification.new do |spec|
  spec.name          = "new_gem"
  spec.version       = NewGem::VERSION
  spec.authors       = ["Mikazuki Fuyuno"]
  spec.email         = ["mikazuki_fuyuno@example.com"]

  spec.summary       = %q{TODO: Write a short summary, because Rubygems requires one.}
  spec.description   = %q{TODO: Write a longer description or delete this line.}
  spec.homepage      = "TODO: Put your gem's website or public repo URL here."

  # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
  # delete this section to allow pushing this gem to any host.
  if spec.respond_to?(:metadata)
    spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
  else
    raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
  end

  spec.files         = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
  spec.bindir        = "exe"
  spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
  spec.require_paths = ["lib"]

  spec.add_development_dependency "bundler", "~> 1.10"
  spec.add_development_dependency "rake", "~> 10.0"
  spec.add_development_dependency "rspec"
end

spec.authors , spec.email は、 Git の設定を元に自動で設定してくれています。
ということで、コード内に TODO とある部分を編集します。

また、依存ライブラリがある場合も、こいつに設定していきます。
例えば、 nokogiri に依存している場合は、

spec.add_dependency "nokogiri"

と、開発環境のみの依存はすでに記述されているようにできます。


gem のコード自体は、 lib/new_gem 以下に、クラスを増やしていきます。
lib/new_gem.rb には、とりあえず require だけ書いておけばいいんじゃないかなと。
ということで、こんな感じ

require 'new_gem/version'

クラスを増やした場合、例えば Cat クラス (lib/new_gem/cat.rb) は、

require 'new_gem/version'
require 'new_gem/cat'

といったように、適度に追加していきます。

gem が完成したら、 rake build でビルドすると、ローカルにインストールすることができます。
インストールする場合は下のコマンドでインストールできます。

gem install -l pkg/new_gem-VERSION.gem -V

rubygems.org へと公開する場合は、 gemspec を変更する必要があります。

  # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
  # delete this section to allow pushing this gem to any host.
  if spec.respond_to?(:metadata)
    spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
  else
    raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
  end

この部分を削除します。
んで、 rake release で公開されます。
この時、 Git にタグ付けが行われるので、 変更は commit しておく必要があります。

ということで、 gem を作って使う/公開する流れでした。