何か作って勉強しないといけないな、と思ったので gem を作成してみる。
今のところはMySQL関連の何かを作ってみようかなぁと。ActiveRecordまわりをちょっと調べたいためです。
Gem を作るためにまず
bundle gem
コマンドを打って雛形を作成する。ここらへんの手順については、パーフェクトRuby の 13章 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.summary
と spec.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 の変更だったりするので気をつけろ![emoji-exclamation emoji-exclamation](data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACKFBMVEUAAADnLS2/AADsRETxWFjxWVnxVlbtR0f/Z2f/AAD/pKTZGhpPAADnMzPFDw//KSnSFha8Dg7VExPJEhLQKSnLEhLFERG2AADGEhLCDw/BERG+EBC5EBC2EBCzDg6xDg6sDQ3KEhKwCQlVBwfoFhbBEBCxCgqLCwvNExO6EBC8ERGxDw+wDw+pDg6ZDAyaDQ22Dw+iKiraJCTGERHcLy/HIyOhDg6rDg6nDAycDQ2cCwuLCQmMCwt+Cgp2CAiOCQl9Cgp5CQmfDQ3/JCSRDQ10CAhsCAhtCAhtBwf/l5f6s7P4srL/r6//paXlMjLwTEzxTk7xTk7vSEjnMzPUFhbhGhrSFhbNERHbExPIEhLIEhLbFBTYExPDERHEERHWExPTExO+Dw+/ERHSExPOEhK0Dw+1Dw/NEhLKEhKgDw+rDQ3IERHGERF5BwfDERHAERG+EBDKEhK7EBC5EBDFERG2Dw+1EBDDERHBERGwDw+vDg68EBC6EBCqDw+ZDAyYDAyZCwuYDAyZDQ3JRUXXTU3DQ0PJIyPQKCjNKCjQKCjFISGlDAy7ExO6ExOYDQ2rDg6pDQ1+BwcrAQGVDAynDg6kDQ2SCwtyCAiCCgqHCwuACgplBwfjGhrlGxvmGxveExPiFBThFBTfFBTcFBTZExPWExPTEhLSEhLPEhLQEhLOEhLMEhLNEhLIEhLKEhLHERHBEBC6EBC2DQ27ERG1Dw+0Dw+tDg7////tViPFAAAAnHRSTlMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAgFho6Chny+E/khl8TxM9+MpNe3VFiHjxQwW0qwGDLuSAqV7kf1kdvdKWv3wNEb75iYijZZ+EBswE0bQ770sC7aMEcigAwF9/PFXDWOOUQWoUqBiAAAAAWJLR0S33QA7ZwAAAAd0SU1FB+QFDhEANrtgV6kAAAEWSURBVCjPY2AAA0YmZhZWVlY2dnYGVMDB6enl7e3t48uFJsHN4+cfEBgYFMyLJsHHHzJn7tx5oWECaBKCQuHzFyxcEBEpjCYhIhoVvWjRophYMTQJcYm4+MWLFyckSqJJMEglJS9ZsiQlVRpdQiYtfenSpRmZsugSclnZy5Ytz2GQR5dQyM1bsXJVvqISuoSySsHqNYVFqmroEuoaxWvXlZRqMmAArbLy9RWV2pgSOlXVG2pqdTEl9OrqGxqb9DHEDQw5m1tajTgxJIxN2to7OrtMzdAlzLt7Nm7a3MtggS5h2de/ZcvWCROtMPwxafKUbVOn6VujS9jYTp8xc9ZsO3sM2x0cnZxdXB0x/cHg5u7u4YHgAgA7eUrxB37bCgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOS0wNC0wNlQyMDoyMDo0MyswMDowMGJLEAIAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTktMDQtMDZUMjA6MjA6NDMrMDA6MDATFqi+AAAAAElFTkSuQmCC)
1. Fork it ( https://github.com/[my-github-username]/hoge/fork )