何か作って勉強しないといけないな、と思ったので gem を作成してみる。

今のところはMySQL関連の何かを作ってみようかなぁと。ActiveRecordまわりをちょっと調べたいためです。

Gem を作るためにまず

bundle gem コマンドを打って雛形を作成する。ここらへんの手順については、パーフェクトRuby13章 gemパッケージの作り方 が詳しい。

作業をしようとしている適当なディレクトリで、bundle gem hoge コマンドを入力する。(hoge はgem名)

% bundle gem hoge
      create  hoge/Gemfile
      create  hoge/Rakefile
      create  hoge/LICENSE.txt
      create  hoge/README.md
      create  hoge/.gitignore
      create  hoge/hoge.gemspec
      create  hoge/lib/hoge.rb
      create  hoge/lib/hoge/version.rb
Initializing git repo in /home/muryoimpl/tmp/gems/hoge

もし、テストをrspecで書こうと思っているのであれば、bundle gem hoge -t とすると、spec の雛形まで作成してくる。

% bundle gem hoge -t
      create  hoge/Gemfile
      create  hoge/Rakefile
      create  hoge/LICENSE.txt
      create  hoge/README.md
      create  hoge/.gitignore
      create  hoge/hoge.gemspec
      create  hoge/lib/hoge.rb
      create  hoge/lib/hoge/version.rb
      create  hoge/.rspec
      create  hoge/spec/spec_helper.rb
      create  hoge/spec/hoge_spec.rb
      create  hoge/.travis.yml
Initializing git repo in /home/muryoimpl/tmp/gems/hoge

ちょっとgemspecを直す

gem を作成するためには、gemspec の内容を整える必要がある。

Gem::Specification.new do |spec|
  spec.name          = "hoge"
  spec.version       = hoge::VERSION
  spec.authors       = ["muryoimpl"]
  spec.email         = ["muryoimpl@gmail.com"]
  spec.summary       = %q{TODO: Write a short summary. Required.}
  spec.description   = %q{TODO: Write a longer description. Optional.}
  spec.homepage      = ""
  spec.license       = "MIT"

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

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

spec.name等は bundle gem コマンドを打った時に入っているはず。 author, email は git で設定しているものがすでに入っているはず。

spec.summaryspec.description にgemの説明を入れませう。

gemspec に依存関係を書く

下3行に以下のコードがありますが、このadd_development_dependencyは開発時に使うgemを書く。例えば、テストにしか使わない rspec は add_development_dependency に書く。

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

実際にgemを動かすために必要なgemは、add_dependency に記載する。 ActiveRecord と Mysql2 を使おうとすると、以下のように記述する。

  spec.add_dependency "mysql2"
  spec.add_dependency "activerecord"

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

だいたいこんなところで、準備ができているはず。

もし Github とかにソースを置くなら

bunlde gem コマンドが出力するものと、Githubでリポジトリを作成したときのものは少し違うので注意。

例えば、LICENSEはGithubは選択して出力できたりするが、bundle gem は MIT LICENSE が自動で出力されていたと思う。出力されるREADME の内容も違った。

bundle gem したもので構わないのであれば force push してしまえばいいし、いいとこどりをしたいのであれば、マージしてから push する。

すげー忘れるのが、README にある URL の変更だったりするので気をつけろ:exclamation:

1. Fork it ( https://github.com/[my-github-username]/hoge/fork )