GitHub で gem を自動作成させるときの注意

GitHub では、gem パッケージを作成してくれる機能がある。
やり方:

  1. GitHub のプロジェクト管理ページから「edit」をクリックし、「RubyGem」のチェックボックスにチェックを入れる。
  2. 自分のプロジェクト用の *.gemspec ファイルを commit & push する。このとき、バージョン番号をあえて 0.0.0 にしておくことをお勧めする。
  3. *.gemspec ファイルでバージョン番号を更新して commit & push する。← 重要!
  4. 成功すると、しばらくしたあとに http://gems.github.com/list.html に Gem 名が現れる。失敗した場合は自分宛にメッセージが届いているはずなので、それを読む。

それ以外にも GitHub での gem 作成はけっこうハマるポイントがある。ローカルでの gem 作成はまったく問題がなくても、GitHub 上ではうまくいかなくて苦労したので、それを紹介する。

Gem が生成されない。エラーメッセージが自分宛に届いてないので、そもそもGemを作成するコマンドが実行されてないっぽい。

GitHub では *.gemspec ファイルのバージョン番号が更新されたときにのみ Gem を生成する。だから *.gemspec を最初に commit & push したときは、Gem が生成されない(バージョン番号が更新されているわけではないから)。まずは *.gemspec ファイルをバージョン 0.0.0 とかで commit & push し、そのあとバージョンを上げて commit & push し直す。
使いづらいなー。

「in `gem_original_require': Insecure operation - gem_original_require (SecurityError)」というエラーがでる

これは *.gemspec ファイルの中で 'require "rubygems"' をしている場合に起きるようだ。つまり、すでに rubygems が require 済みのときにさらに 'require "rubygems"' を実行しようとしていることが原因というわけ。
対策としては、*.gemspec ファイルのなかで rubygems を require しないか、「require "rubygems" unless defined?(Gem)」とすること。

「in `glob': Insecure operation - glob (SecurityError)」というエラーがでる

これは、$SAFE が設定されている状態で Dir.glob() を使っているのが原因。ローカルで実行するときは $SAFE が設定されてないので Dir.glob() は問題なく実行できるが、GitHub 上では $SAFE が設定されるため、Dir.glob() を使うとエラーになる。
対策としては、Dir.glob() を使わずにファイル名をひとつずつ列挙すること。

「undefined method `validate' for nil:NilClass (NoMethodError)」というエラーがでる

これは、*.gemspec ファイルの最後が Gem::Specification オブジェクトでないことが原因。たとえば *.gemspec ファイルの最後で「if $0 == __FILE__ ... end」とかやってると、このエラーがでる。
対策としては、*.gemspec ファイルの最後が Gem::Specification オブジェクトで終わるようにすること。


なお GitHub での gem 作成をローカルでシミュレートするためのスクリプトGitHub.com から提供されているので、これでテストするといいみたい。

$ ruby github-test.rb mysql-ruby.gemspec
WARNING:  RDoc will not be generated (has_rdoc == false)
#<Gem::Specification name=mysql-ruby version=2.8.1>
OK


ちなみに、GitHub での Gem 生成機能はみんな嵌っているらしい。

何回か同じことではまりました。どうも、"RubyGem" にチェックを入れた直後に gemspec を push すると失敗するような気がします。
チェックを入れて 10 分くらい待ってから push すればうまく行きました。
また失敗状態になっても、gemspec を一旦消して push しなおすと生成されるようです。

github で gem が生成されない・・・ - kなんとかの日記

なんか、「Build Gem package」みたいなボタンが欲しいですよね。今の仕様はいけてない。