Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

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