kなんとかの日記 このページをアンテナに追加

2009-02-13

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

| 03:06 |  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.htmlGem 名が現れる。失敗した場合は自分宛にメッセージが届いているはずなので、それを読む。

それ以外にも 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」みたいなボタンが欲しいですよね。今の仕様はいけてない。

snaka72snaka72 2009/04/09 06:35 参考にさせていただきましたー。
以下の挙動は、現時点では改善されてるっぽいですね。0.0.0でアップしたら、0.0.0のgemが公開されてしまいましたwwww。
すぐ、0.0.1をpushし直しましたがw。

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

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

>使いづらいなー。

トラックバック - http://d.hatena.ne.jp/kwatch/20090213/1234548372