Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

HowToBuildGem

Gemの作り方

るびま10号「シリーズ パッケージマネジメント 【第 2 回】 RubyGems (2)」に簡単そうな例が出ている。

しかしなんだか要領を得ないので、実際にRjbのGem化作業を記録する。

参考

RubyGems User Guide

7. Creating Your Own Gem

重要なのは以下の点だと書いてある。

  • gem specificationの作成
  • gem buildの実行

しかしそれと同時に

rakeを利用すべきである。

としか書いていない。なぜならば

This is a skimpy overview; see the DeveloperGuide? for the real meat.""

しかし、お肉を求めて探したがDeveloperGuideはどこにも見つからない。

お肉を探して

最初に仕様にたどりつく。

Gemspec Reference(http://docs.rubygems.org/read/chapter/20)

Gem::Specificationの属性はこの文書に出ている。

重要な属性

  • name
  • version
  • platform
  • summary
  • require_paths
    • ['lib']
  • files
  • dependencies
  • version

ドキュメント

  • author
  • description
  • email
  • homepage
  • requirements
  • rubyforge_project
  • summary

特殊

  • autorequire

生成に関するもの

  • bindir
  • executables
  • extensions
    • extconf.rbの位置
  • extra_rdoc_files
  • date
  • default_executable
  • has_rdoc
  • rdoc_options
  • require_ruby_version
  • test_files
    • 単数の場合はtest_file

実際にRakeファイルを記述する

RakeのAPIドキュメントではわからないこと

明示的なrequireが必要

require 'rake/gempackagetask'

Rake::GemPackageTaskのタスク名は:package

desc "Default Task"
task :default => [ :package ]

問題点

rjbの問題点は、shareディレクトリを利用する点にある。

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/5882

特に、拡張ライブラリのため__FILE__が利用できないため、config['datadir'] のみがパス取得手段だというのが問題となる。

というのは、Gemでは、libと同列のdataがデータディレクトリとなるからだ。

結局、あきらめて以下のようなスクリプトを導入して、拡張ライブラリを内部的に呼ぶよう変えた。

require 'rbconfig'

module RjbConf
  dir = File.join(File.dirname(File.dirname(__FILE__)), 'data')
  if File.exist?(dir)
    datadir = dir
  else
    datadir = Config::CONFIG['datadir']
  end
  BRIDGE_FILE = File.join(datadir, 'rjb', 'jp', 'co', 'infoseek', 'hp',
                          'arton', 'rjb', 'RBridge.class')
  unless File.exist?(BRIDGE_FILE)
    raise 'bridge file not found'
  end
end

require 'rjbcore'   # load extended library
Last modified:2006/08/01 23:59:00
Keyword(s):
References: