gemパッケージの作り方





Railsの開発ではgemを使わないと何もできないが、ふとgemってどう作るんだろうという疑問がいまさらわいてきた。
ということで自分でgemパッケージを作ってみた。
gemを作るためのnewgemという便利なものがあったのでそれを利用してみた。

1 newgemのインストール
まずはnewgemをインストールする。

$ gem install rubyforge
$ gem install newgem

2 ひな形の作成と編集
newgemコマンドを発行して作成するgem(mygemtest)のひな形ファイルを生成する。

$ newgem mygemtest -T rspec
      create  lib/mygemtest
      create  script
      create  History.txt
      create  Rakefile
      create  README.rdoc
      create  PostInstall.txt
      create  lib/mygemtest.rb
  dependency  install_rspec
      create    spec
      create    tasks
      create    spec/mygemtest_spec.rb
      create    spec/spec.opts
      create    spec/spec_helper.rb
      create    tasks/rspec.rake
  dependency  install_rubigen_scripts
      exists    script
      create    script/generate
      create    script/destroy
      create  script/console
      create  Manifest.txt
      readme  readme

“-T rspec”でテストフレームワークとしてRSpecを指定している。

Rakefileのself.developerの”FIXME”の部分を変更する。

$hoe = Hoe.spec 'mygemtest' do
  self.developer 'anthony', 'anthony@abc.com'   self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required

README.rdocの”FIX”の部分を変更する。

= mygemtest

* http://github.com/#{github_username}/#{project_name}

== DESCRIPTION:

FIX (describe your package)

== FEATURES/PROBLEMS:

* FIX (list of features or problems)

== SYNOPSIS:

  FIX (code sample of usage)

== REQUIREMENTS:

* FIX (list of requirements)

== INSTALL:

* FIX (sudo gem install, anything else)

== LICENSE:

(The MIT License)

3 ライブラリコードの追加
lib/mygemtestにライブラリコードとしてmyclass.rbを以下の内容で作成する。

module MyGemTest
  class MyClass
    def initialize
        puts "Initialized Done !!"
    end
   end
end

4 パッケージ作成
gemパッケージを作成する。
Manifest.txtに作成したmyclass.rbのパスを追加しておく。
これをしておかないとgemファイルに作成したライブラリコードが含まれない。
(これで1時間くらい悩んだ orz)

History.txt
Manifest.txt
PostInstall.txt
README.rdoc
Rakefile
lib/mygemtest.rb
lib/mygemtest/myclass.rb <- 追加
script/console
script/destroy
script/generate
spec/mygemtest_spec.rb
spec/spec.opts
spec/spec_helper.rb
tasks/rspec.rake

gemファイル生成を以下のファイルで行う。

 $ rake package 

pkgディレクトリにmygemtest-0.0.1.gemというファイルができているので、ちゃんと動作するかgemファイルをインストールしてみる。

 $ sudo gem install -l mygemtest-0.0.1.gem 
 PostInstall.txt 
 Successfully installed mygemtest-0.0.1 1 gem installed 
 Installing ri documentation for mygemtest-0.0.1... Building YARD (yri) index for mygemtest-0.0.1... 
 Installing RDoc documentation for mygemtest-0.0.1... 

irbで動作確認をする。

 $ irb 
irb(main):001:0> require "mygemtest/myclass"
irb(main):003:0> a = MyGemTest::MyClass.new
Initialized done !!
=> #

初期化メソッドが呼ばれていれば正しくインストールされている。

5 コマンドをgemに追加
gemパッケージにはライブラリコードだけでなくコマンドも追加できる。
以下のコマンドでコマンド用の雛形を生成する。

 $ ./script/generate executable mygemtest
    create  bin
      exists  lib/mygemtest
      create  bin/mygemtest
      create  lib/mygemtest/cli.rb
      exists  spec
      create  spec/mygemtest_cli_spec.rb

lib/mygemtest/cli.rbというファイルが生成されているので下のソースの39行目以降にコマンドのコードを書く。

require 'optparse'

module Mygemtest
  class CLI
    def self.execute(stdout, arguments=[])

      # NOTE: the option -p/--path= is given as an example, and should be replaced in your application.

      options = {
        :path     => '~'
      }
      mandatory_options = %w(  )

      parser = OptionParser.new do |opts|
        opts.banner = <<-BANNER.gsub(/^          /,'')
          This application is wonderful because...

          Usage: #{File.basename($0)} [options]

          Options are:
        BANNER
        opts.separator ""
        opts.on("-p", "--path PATH", String,
                "This is a sample message.",
                "For multiple lines, add more strings.",
                "Default: ~") { |arg| options[:path] = arg }
        opts.on("-h", "--help",
                "Show this help message.") { stdout.puts opts; exit }
        opts.parse!(arguments)

        if mandatory_options && mandatory_options.find { |option| options[option.to_sym].nil? }
          stdout.puts opts; exit
        end
      end

      path = options[:path]

      # do stuff ここにコードを追加
      stdout.puts "コマンド動いたよ!"
    end
  end
end

Manifest.txtにcli.rbのパスを追加。

History.txt
Manifest.txt
PostInstall.txt
README.rdoc
Rakefile
lib/mygemtest.rb
lib/mygemtest/cli.rb  <- 追加
lib/mygemtest/myclass.rb
script/console
script/destroy
script/generate
spec/mygemtest_spec.rb
spec/spec.opts
spec/spec_helper.rb
tasks/rspec.rake

再度、rake packageでgemパッケージを作りなおして再インストールすればコマンドが使えるようになる。
newgemの解説がいまいちちゃんとしたものがなかったので結構試行錯誤してしまったが、これだけおさえておけば普通に使う分には十分でしょう。
後、テストコードの書き方とか気が向いたら書くかも。

参考URL: gemパッケージの作り方

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です