GitHub で gem を自動作成させるときの注意
GitHub では、gem パッケージを作成してくれる機能がある。
やり方:
- GitHub のプロジェクト管理ページから「edit」をクリックし、「RubyGem」のチェックボックスにチェックを入れる。
- 自分のプロジェクト用の *.gemspec ファイルを commit & push する。このとき、バージョン番号をあえて 0.0.0 にしておくことをお勧めする。
- *.gemspec ファイルでバージョン番号を更新して commit & push する。← 重要!
- 成功すると、しばらくしたあとに 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 すると失敗するような気がします。
github で gem が生成されない・・・ - kなんとかの日記
チェックを入れて 10 分くらい待ってから push すればうまく行きました。
また失敗状態になっても、gemspec を一旦消して push しなおすと生成されるようです。
なんか、「Build Gem package」みたいなボタンが欲しいですよね。今の仕様はいけてない。