Rubyで逆ポーランド変換機を作りgem作成&コマンドの使い方:若手エンジニア/初心者のためのRuby 2.1入門(13)(2/4 ページ)
オープンソースのオブジェクト指向プログラミング言語「Ruby」の文法を一から学ぶための入門連載。最新版の2.1に対応しています。連載最終回の今回は、小規模なgemの作成にチャレンジしてみましょう。gem作成の一連の流れを体験するために、逆ポーランド記法による計算機アプリケーションを作ってみましょう。
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
以下のように書き換えて、「RpnCalculator.run」と書くとターミナルに文字列が出力されるようにしてみましょう。
require "rpn_calculator/version" module RpnCalculator class << self def run(args) puts "my first gem" end end end
ここでは、前回紹介したクラスメソッドを定義するテクニックを使っています。モジュールの場合でも、同様にモジュールに対してメソッドを定義できます。
また、新しく「bin/rpn_calculator」ファイルを作成し、以下のように入力して保存してください。
#!/usr/bin/env ruby require "rpn_calculator" RpnCalculator.run(ARGV)
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.
関連記事
- 数々の“スペル”で高度なプログラミング:Rubyの魔術
- 公用語に英語、「再起動」したRubyKaigi 2013が東京で開催
いったん終了していたRubyコミュニティ主催の年次イベントが再開。技術色、国際色を強め、盛況のうちに幕を閉じた - Web業界、今から行くならRubyエンジニアが狙い目?
不況で冷え込んでいたIT業界の転職市場に、回復の兆しが見え始めている。だが、業種や職種によって採用数や条件に大きな差異が生まれている。転職市場の動向を追い、自身のキャリア戦略立案に生かしてほしい。 - Ruby 2.0.0がリリース、大規模化対応の機能などを搭載
生誕20年となる節目を迎えて、プログラミング言語「Ruby」の最新版がリリースされた - 新バージョンで何が変わるのか、Rubyはどこへ向かうのか:まつもと×笹田、Ruby 1.9を語る
- いよいよ始まるRuby 1.9への移行:開発コアメンバが語るRubyの今とこれから(前編)
- Rubyの今後の進化の方向性とは?:開発コアメンバが語るRubyの今とこれから(後編)
- 互換性や脆弱性の問題にどう対応していくのか:Rubyが抱える課題、NaClの前田氏が講演
- Rails Hub情報局:「なんでRubyなんか作った!? 迷惑だ!」に対するMatzの答え
- Rails Hub情報局:Rubyはイノベーション言語として選ばれている
- Rails Hub情報局:Rubyのまつもと氏は、一発屋で終わるのか?
- Rails Hub情報局:Rubyに魔法は要らない
- 数々の“スペル”で高度なプログラミング:Rubyの魔術
- 晴読雨読@エンジニアライフ:『たのしい開発 スタートアップRuby』――なぜRubyistたちはあれほど楽しそうなのか
- 「JRuby 1.7.0」登場、1年半ぶりのメジャーアップデート
JavaVM上のRuby実装「JRuby」の最新版となる「JRuby 1.7.0」が、10月22日にリリースされた。