検索
連載

Rubyで逆ポーランド変換機を作りgem作成&コマンドの使い方若手エンジニア/初心者のためのRuby 2.1入門(13)(2/4 ページ)

オープンソースのオブジェクト指向プログラミング言語「Ruby」の文法を一から学ぶための入門連載。最新版の2.1に対応しています。連載最終回の今回は、小規模なgemの作成にチャレンジしてみましょう。gem作成の一連の流れを体験するために、逆ポーランド記法による計算機アプリケーションを作ってみましょう。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

bundle gemコマンドのジェネレーターでgemのひな型を作成

 bundleコマンドによるジェネレーターを使うことで、プロジェクトのひな型を簡単に作ることができます。ここでは、ジェネレーターの便利さにあやかりましょう。

$ bundle gem rpn_calculator -t

 以上のコマンドを実行すると、gemに必要なファイル一式がrpn_calculatorディレクトリに格納されます。ここではRSpecを用いて簡単なユニットテストも用意するので、bundleコマンドの引数に「-t」を与えています。

 ジェネレーターコマンドを実行すると、以下のような出力が得られるでしょう。

$ bundle gem rpn_calculator -t
      create  rpn_calculator/Gemfile
      create  rpn_calculator/Rakefile
      create  rpn_calculator/LICENSE.txt
      create  rpn_calculator/README.md
      create  rpn_calculator/.gitignore
      create  rpn_calculator/rpn_calculator.gemspec
      create  rpn_calculator/lib/rpn_calculator.rb
      create  rpn_calculator/lib/rpn_calculator/version.rb
      create  rpn_calculator/.rspec
      create  rpn_calculator/spec/spec_helper.rb
      create  rpn_calculator/spec/rpn_calculator_spec.rb
      create  rpn_calculator/.travis.yml
Initializing git repo in /Users/flost/var/repo/diy/ruby/rpn_calculator

 これらのファイルの意味については、後々説明します。

補足:bundlerが使えない場合

 もしbundleコマンドが見つからなくて使えない場合は、以下のようにしてbundlerをインストールしてください。

$ gem install bundler

gemspecファイルを埋める

 gemのメタデータ(作者の情報や、依存パッケージの情報など)はgemspecファイルに記述します。今回は「rpn_calculator」という名前でひな型を用意したので、rpn_calculator.gemspecファイルにメタデータを記述します。

 ひな型を作成したすぐの状態では、以下のようになっていると思います。

# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'rpn/calculator/version'
 
Gem::Specification.new do |spec|
  spec.name          = "rpn_calculator"
  spec.version       = Rpn::Calculator::VERSION
  spec.authors       = ["Moza USANE"]
  spec.email         = ["mozamimy@quellencode.org"]
  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.authorsやspec.emailは、作者の名前やメールアドレスを設定する項目です。もし作者やメールアドレスがGitで設定されていると、ひな型を作成したときにその情報で埋められるようです。

 ここでは、spec.authorsとspec.email、spec.homepage辺りをあなた自身の情報に変えるだけで十分です。もし書きたければ、spec.summaryやspec.descriptionにgemの情報を書いてもよいでしょう。

 ここで設定した各種情報はRubyGems.org等で公開する際に利用されるので、もしRubyGems.orgにアップロードする予定があるなら、漏れなく記述するようにしましょう。

ひな型のコードを編集する

 ひな型のコードを少し編集して、取りあえずターミナルに文字列を出力するところまで作ってみましょう。

 rpn_calculatorというプロジェクト名で初期化したので、ひな型としてRpnCalculatorモジュールが「/lib/rpn_calculator.rb」に用意されています。デフォルトの状態では以下のようになっているでしょう。

require "rpn_calculator/version"
 
module RpnCalculator
  # Your code goes here...
end
/lib/rpn_calculator.rb

 以下のように書き換えて、「RpnCalculator.run」と書くとターミナルに文字列が出力されるようにしてみましょう。

require "rpn_calculator/version"
 
module RpnCalculator
  class << self
    def run(args)
      puts "my first gem"
    end
  end
end
/lib/rpn_calculator.rb

 ここでは、前回紹介したクラスメソッドを定義するテクニックを使っています。モジュールの場合でも、同様にモジュールに対してメソッドを定義できます。

 また、新しく「bin/rpn_calculator」ファイルを作成し、以下のように入力して保存してください。

#!/usr/bin/env ruby
 
require "rpn_calculator"
 
RpnCalculator.run(ARGV)
/bin/rpn_calculator

 1行目は、rpn_calculatorがRubyスクリプトとして処理するために必要なshebangと呼ばれるものです。

 3行目でRpnCalculatorモジュールを利用できるようにするために、rpn_calculatorをrequireしています。

 5行目では、RpnCalculatorモジュールに定義されたrunメソッドを、コマンドライン引数ARGVをそのまま渡して実行しています。

 また、rpn_calculatorをスクリプトとして実行できるように、以下のコマンドで実行権限を与えることも忘れないようにしましょう。

$ chmod +x bin/rpn_calculator

bundle installコマンドで依存ライブラリをインストール

 rpn_calculator.gemspec中の以下の内容に注目してください。

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

 これらは、作成するgemが依存しているパッケージを示しています。spec.add_development_dependencyには、開発時にのみ必要なgemを記述します。また、spec.add_dependencyを設定すると、通常使用する際にも必要なgemの依存関係も定義できます。もし別のgemを使いたい場合は、ここに追記していくようにします。

 開発時にはこれらの依存パッケージが必要となるので、bundleコマンドでインストールします。

$ bundle install --path vendor/bundle

 「--path vendor/bundle」オプションを付加することによって、インストールする依存ライブラリをvendor/bundleディレクトリ以下にまとめることができます。プロジェクトごとに依存ライブラリを管理しやすいので、現場では「--path vendor/bundle」を付けることが多いです。

 bundle installコマンドを実行すると、以下のような出力が得られ、依存ライブラリをインストールできました。

$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Installing rake 10.4.2
Using bundler 1.7.3
Installing diff-lcs 1.2.5
Using rpn_calculator 0.0.1 from source at .
Installing rspec-support 3.1.2
Installing rspec-core 3.1.7
Installing rspec-expectations 3.1.2
Installing rspec-mocks 3.1.3
Installing rspec 3.1.0
Your bundle is complete!
It was installed into ./vendor/bundle

bundle execコマンドで実行する

 bundlerでインストールしたライブラリを使ってスクリプトを起動するためには、起動したいスクリプトの前に、「bundle exec」を付けて起動します。ここでは、先ほど用意した「/bin/rpn_calculator」を実行したいので、以下のコマンドを実行します。

$ bundle exec bin/rpn_calculator

 ここまでの作業に間違いがなければ、めでたく以下のように文字列が出力されるでしょう!

$ bundle exec bin/rpn_calculator 
my first gem

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る