The Backyard - HowToBuildGem Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
!Gemの作り方
[[るびま10号「シリーズ パッケージマネジメント 【第 2 回】 RubyGems (2)」|http://jp.rubyist.net/magazine/?0010-PackageManagement]]に簡単そうな例が出ている。
しかしなんだか要領を得ないので、実際にRjbのGem化作業を記録する。
!!参考
[[RubyGems User Guide|http://docs.rubygems.org/read/book/1]]
[[7. Creating Your Own Gem|http://docs.rubygems.org/read/chapter/5]]
重要なのは以下の点だと書いてある。
*gem specificationの作成
*gem buildの実行
しかしそれと同時に
""[[rake|http://rake.rubyforge.org]]を利用すべきである。
としか書いていない。なぜならば
""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ドキュメント|http://rake.rubyforge.org/classes/Rake/GemPackageTask.html]]ではわからないこと
明示的な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
[[るびま10号「シリーズ パッケージマネジメント 【第 2 回】 RubyGems (2)」|http://jp.rubyist.net/magazine/?0010-PackageManagement]]に簡単そうな例が出ている。
しかしなんだか要領を得ないので、実際にRjbのGem化作業を記録する。
!!参考
[[RubyGems User Guide|http://docs.rubygems.org/read/book/1]]
[[7. Creating Your Own Gem|http://docs.rubygems.org/read/chapter/5]]
重要なのは以下の点だと書いてある。
*gem specificationの作成
*gem buildの実行
しかしそれと同時に
""[[rake|http://rake.rubyforge.org]]を利用すべきである。
としか書いていない。なぜならば
""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ドキュメント|http://rake.rubyforge.org/classes/Rake/GemPackageTask.html]]ではわからないこと
明示的な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