HowToBuildGem
Gemの作り方
るびま10号「シリーズ パッケージマネジメント 【第 2 回】 RubyGems (2)」に簡単そうな例が出ている。
しかしなんだか要領を得ないので、実際にRjbの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
- 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
Keyword(s):
References: