Rubyでプログラミングすると必ずと言っていいほど使うGemを自作してみましょう。
環境: Mac OS X, Ruby 2.3.1p112
前提としてRubyがインストールされていることとします。Rubyのインストール方法は過去記事の「MacOSにHomebrewのインストール」を参照してください。
GemのアップデートとBundlerインストール
GemのアップデートとBundlerインストールを行います。
1 2 | $ gem update --system $ gem install bundler |
Gemのひな形作成
Gemのひな形はコマンドで簡単に出来てしまいます。
今回は簡単なCLIツールを作ってみます。
「test_gem hello」と入力すると、
“Hello World!!”と出力するGemを作ってみましょう。
既存のGemと名前が重複しないように注意してください。Gem一覧はrubygems.orgで検索できます。Gemは本来はspecでテストするべきなのですが、今回は練習用なので省略します。名前は、仮にtest_gemとしておきます。
さっそくbundlerを使ってGemのひな形作成をしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ bundle gem test_gem -b Creating gem 'test_gem'... MIT License enabled in config Code of conduct enabled in config create test_gem/Gemfile create test_gem/.gitignore create test_gem/lib/test_gem.rb create test_gem/lib/test_gem/version.rb create test_gem/test_gem.gemspec create test_gem/Rakefile create test_gem/README.md create test_gem/bin/console create test_gem/bin/setup create test_gem/LICENSE.txt create test_gem/CODE_OF_CONDUCT.md create test_gem/exe/test_gem Initializing git repo in /Users/username/gems/test_gem |
上記のようなファイルを自動で生成してくれます。これらのファイルはGitで管理することができます。Githubに公開するのが一般的です。
ファイル「test_gem.gemspec」にはどういったGemかといった説明や、作者の簡単な情報を入力する必要があります。
Gemの実装・ビルド
CLIツールに必要な依存Gemとして”thor”を記載します。
「test_gem/test_gem.gemspec」の下の方に「spec.add_dependency ‘thor’」と追記します。
TODOの記載のある、spec.summary 、spec.description、spec.homepageには適切な文言を入力してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | # 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 = ['xxxxxx'] spec.email = ['xxxxxx'] 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." spec.license = 'MIT' # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host' # to allow pushing to a single host or delete this section to allow pushing 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("\n").reject do |f| f.match(%r{^(test|spec|features)/}) end spec.bindir = 'exe' spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.require_paths = ['lib'] spec.add_development_dependency 'bundler', '~> 1.13' spec.add_development_dependency 'rake', '~> 10.0' spec.add_dependency 'thor' #追記 end |
test_gem/exe/test_gemを編集してみましょう。
以下の様なソースにします。
「version」、「-h」、「hello」といったオプションに対応させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #!/usr/bin/env ruby # coding: utf-8 require 'test_gem' require 'thor' module TestGem class CLI < Thor class_option :help, type: :boolean, aliases: '-h', desc: 'help message.' class_option :version, type: :boolean, desc: 'version' default_task :hello desc 'hello', 'Say "Hello World!!"' def hello puts "Hello World!!" end desc 'version', 'version' def version p TestGem::VERSION end end end TestGem::CLI.start(ARGV) |
bundle installします。
1 | $ bundle install |
さっそくビルドしてみます。
1 2 | $ rake build test_gem 0.1.0 built to pkg/test_gem-0.1.0.gem. |
ローカルにできあがったgemをインストールします。
1 | $ gem install -l pkg/test_gem-0.1.0.gem -V |
Gemのテスト
ヘルプコマンドを入力してみましょう。
1 2 3 4 5 6 7 8 9 | $ test_gem -h Commands: test_gem hello # Say "Hello World!!" test_gem help [COMMAND] # Describe available commands or one specific command test_gem version # version Options: -h, [--help], [--no-help] # help message. [--version], [--no-version] # version |
色々コマンドを試してみます。
1 2 3 4 5 6 | $ test_gem Hello World!! $ test_gem hello Hello World!! $ test_gem version "0.1.0" |
今回は練習用のGemですが、
きちんと作成したら、この後、rake releaseコマンドでRubygemsに公開することができます。