Ruby2.3でGemを自作しよう(CLIツール)

Rubyでプログラミングすると必ずと言っていいほど使うGemを自作してみましょう。
環境: Mac OS X, Ruby 2.3.1p112
前提としてRubyがインストールされていることとします。Rubyのインストール方法は過去記事の「MacOSにHomebrewのインストール」を参照してください。

プロジェクトの全てのソースはGitHubにおいてあります。

GemのアップデートとBundlerインストール

GemのアップデートとBundlerインストールを行います。

$ 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のひな形作成をしてみます。

$ 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には適切な文言を入力してください。

# 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         = <code>git ls-files -z</code>.split(&quot;\x0&quot;).reject do |f|
    f.match(%r{^(test|spec|features)/})
  end
  spec.bindir        = &quot;exe&quot;
  spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
  spec.require_paths = [&quot;lib&quot;]

  spec.add_development_dependency &quot;bundler&quot;, &quot;~&gt; 1.13&quot;
  spec.add_development_dependency &quot;rake&quot;, &quot;~&gt; 10.0&quot;
  spec.add_dependency 'thor' #追記
end

test_gem/exe/test_gemを編集してみましょう。
以下の様なソースにします。
「version」、「-h」、「hello」といったオプションに対応させます。

#!/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します。

$ bundle install

さっそくビルドしてみます。

$ rake build
test_gem 0.1.0 built to pkg/test_gem-0.1.0.gem.

ローカルにできあがったgemをインストールします。

$ gem install -l pkg/test_gem-0.1.0.gem -V

Gemのテスト

ヘルプコマンドを入力してみましょう。

$ 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

色々コマンドを試してみます。

$ test_gem
Hello World!!
$ test_gem hello
Hello World!!
$ test_gem version
"0.1.0"

今回は練習用のGemですが、
きちんと作成したら、この後、rake releaseコマンドでRubygemsに公開することができます。


PAGE TOP