RubyライブラリのRubyGemは知らないとハードル高そうに見えますが、実際にはかなり簡単につくれます。
これから積極的にRubyGemを作ってOSSの世界に貢献していきたいので簡単な作り方をまとめました。
準備
まずは準備のためにgem
のアップデートと、bundler
のアップデートを行います。
1
2
3
4
5
6
7
8
# gem自信のアップデート
gem update --system
# bundler未インストールの場合はインストール
gem install bundler
# bundlerインストール済の場合はアップデート
gem update bundler
ひな形の作成
今回はtest_gem
という名前のGemを制作していきます。
1
2
# test_gemのひな形を作成(Rspec付き)
bundle gem test_gem -t
ちなみに、Rails PluginのGemを作成する場合にはgem install rails
をした上で以下のコマンドを実行します。
1
2
# test unitをスキップしたpluginの作成
rails plugin new test_gem2 -T --skip-test-unit --mountable
今回はbundle gem test_gem
の方を説明していきます。Rails Pluginの詳細は以下のサイトに解説があります!
rails pluginコマンドで簡単に出来るgemの作成方法
作成されたファイルの概要
今回作成されたファイルの簡単な説明。
bundle gem test_gem -t
create test_gem/Gemfile
create test_gem/Rakefile
create test_gem/LICENSE.txt
create test_gem/README.md => このgemの説明や使い方を記述
create test_gem/.gitignore
create test_gem/test_gem.gemspec => このgemの説明や依存関係などを記述
create test_gem/lib/test_gem.rb => プログラムを記述
create test_gem/lib/test_gem/version.rb => このgemのバージョン情報を記述
create test_gem/.rspec
create test_gem/spec/spec_helper.rb
create test_gem/spec/test_gem_spec.rb
create test_gem/.travis.yml => travisを使う際の設定を記述
test_gem.gemspecの修正
test_gem.gemspecの中身は以下の様にになっています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# coding: utf-8
lib = File . expand_path ( '../lib' , __FILE__ )
$LOAD_PATH . unshift ( lib ) unless $LOAD_PATH . include? ( lib )
require 'test_gem/version'
Gem :: Specification . new do | spec |
spec . name = 'test_gem'
spec . version = TestGem :: VERSION
spec . authors = [ 'morizyun' ]
spec . email = [ 'merii.ken@gmail.com' ]
spec . summary = %q{TODO: Write a gem summary}
spec . description = %q{TODO: Write a gem description}
spec . homepage = 'http://morizyun.github.io'
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
最低限修正が必要な部分を抜き出すと以下のようになります。
# このgemの説明を書く
spec.summary = %q{TODO: Write a gem summary}
spec.description = %q{TODO: Write a gem description}
# このgemのHomepageを書く
spec.homepage = 'http://morizyun.github.io'
# 依存するgemが存在する場合のみ、以下のように指定
spec.add_dependency 'xxxx', '~>x.x'
# 開発時だけに必要な依存gemが存在する場合のみ、以下のように指定
spec.add_development_dependency 'yyyy', '~>y.y'
Gemの実装
今回はテスト的にHello World!
と出力するようにします。lib/test_gem.rb
を開いて以下のように変更します。
1
2
3
4
5
6
7
require 'test_gem/version'
module TestGem
def self . greet
'Hello World!'
end
end
実行してみよう
では先ほど作成したgemを実行してみます
1
2
3
4
5
6
7
8
9
10
# gem のインストール
bundle install
# rubyの対話型インタプリタを起動
bundle exec irb [ 2 . 1 . 4 ]
irb ( main ): 001 : 0 > require 'test_gem'
=> true
irb ( main ): 002 : 0 > TestGem . greet
Hello World !
ということで無事実行できました!
RSpecを書こう
先ほどのTestGem.greet
のテストをRSepcで書いていきます。spec/test_gem_spec.rb
を以下のように変更します。
1
2
3
4
5
6
7
8
9
10
11
12
13
require 'spec_helper'
describe TestGem do
it 'has a version number' do
expect ( TestGem :: VERSION ) . not_to be nil
end
describe '#greet' do
it 'returns "Hello World!"' do
expect ( TestGem . greet ) . to eq ( 'Hello World!' )
end
end
end
実行コマンドを追加
コンソール上でrun_test_gem
というコマンドを使うとgemの内容を実行したい場合は
例えばbin/run_test_gem
を作成して、以下のように書きます。
1
2
3
4
5
#!/usr/bin/env ruby
require 'test_gem'
puts TestGem . greet
Gem をパッケージ化します。
次にGemをパッケージ化します。コマンドとしては、gem build xxx.gemspec
です。
1
2
3
4
5
6
7
8
9
10
11
12
gem build test_gem.gemspec
= > Successfully built RubyGem
= > Name: test_gem
= > Version: 0.0.1
= > File: test_gem-0.0.1.gem
gem install test_gem
= > Successfully installed test_gem-0.0.1
= > 1 gem installed
run_test_gem
= > "Hello World!"
Gem を公開する
『GitHub 』などのpublicなリポジトリを作成。
1
2
3
4
5
6
7
8
# まずはgit commit
git add . -A && git commit -m 'first commit'
# gitのリモートリポジトリを設定
git remote add origin git@github.com:morizyun/test_gem.git
# そして release
rake release
今回はすでに登録されているgemと名前がかぶっているので登録はできませんが、被らない名前にすればこれで公開できます。
今回のサンプルソース
今回のサンプルソースは以下のリポジトリにあります。良ければForkして試してみてください!
morizyun/test_gem - GitHub
Special Thanks
Gemの作り方まとめ 普通のgem編 - masarakki’s blog
君がOpsでもRubyで書いたライブラリはGemで配ろう
必要最小のgemの作り方とインストール - ザリガニが見ていた…。