(apply-generic op . args)

教育者, 将軍, 栄養士, 心理学者, 親はプログラムする. 軍隊, 学生, 一部の社会はプログラムされる. - 計算機プログラムの構造と解釈 序文

gemパッケージを作ってみた。〜 RubyGems.org へのpushまでの道のり 〜

gemパッケージを作るのに非常に苦労したので忘れない内にメモです。
gemパッケージの作り方なんて全く知らない状態から始めたので、間違っている箇所があるかもしれません。
もし見つけたらツッコミよろしくです。

RubyForge.orgからRubyGems.orgへ

以前:

GitHubとRubyForgeを使用。
GitHubにgemを自動で生成する機能があった。

現在:

RubyGems.org(gemcutter)が普及したから(?)、RubyForge.orgからRubyGems.orgへ移行。
RubyForge.orgではプロジェクトを作るのに結構面倒だったらしいが、RubyGems.orgでは

$gem push projectname-version.gem

だけで済む。
そしてGitHubからgemを生成する機能がなくなったらしいです。
この辺は経験していないのでなんとも。。。

gemを作るのに便利なツール

 gemspecファイルというのが重要で面倒なファイルらしい。
一々自分で書くのは結構大変らしく、雛形を作ってくれるgemパッケージが存在する。
下記した二つが有名所らしい。
二つを併用する事もあるみたい。

jeweler

gemパッケージの雛形を作ってくれる。
しかも

$sudo jeweler --rspec --create-repo projectname

この--create-repoオプションで、GitHub上のリポジトリも作ってくれる。
凄い!
その前に、

$git --global github.name "UserName"
$git --global github.token "123123123123123123123123123123"

としておかないと怒られます。


しかし、jewelerを実行しようとすると

Permission denied (publickey).

なんて怒られる。
GitHub上にリポジトリを作ろうとするとキレるらしい、DV反対!
jewelerでなく、普通にやった場合は問題ないんだが、、、
ググった結果、新しいssh鍵を登録し直したら良いらしい。
・・・そんな簡単に鍵作り直せっかよ!
と、いう訳で今回はjewelerは見送りました。

newgem

今回の本命、これでgemパッケージを作りました。
こちらも雛形を作ってくれます。
とりあえず、次に進みましょー!

まずこれやろう!

gem のヴァージョンアップ

RubyGems.orgの長所は

$gem push projectname-version.gem

これだけでgemパッケージを登録できる点です。
しかし、このpushが現在、gemのversionが1.3.6以降でないと駄目の様です。
自分は1.3.5だったのでversionUPしました。
1.3.6以降の方は読み飛ばしてください。


注意してください!
versionあげるとインストールしたパッケージが空になります!

$sudo gem install rubygems-update
$rubygems-update
=>Pathが通っていないので、フルバスで実行。
$sudo /var/lib/gems/1.8/bin/update_rubygems
sudo: unable to resolve host vivienne
RubyGems 1.3.7 installed

=== 1.3.7 / 2010-05-13

NOTE:

http://rubygems.org is now the default source for downloading gems.

You may have sources set via ~/.gemrc, so you should replace
http://gems.rubyforge.org with http://rubygems.org

http://gems.rubyforge.org will continue to work for the forseeable future.

New features:

 `gem` commands
  `gem install` and `gem fetch` now report alternate platforms when a
    matching one couldn't be found.
    `gem contents` --prefix is now the default as specified in --help.  Bug
    #27211 by Mamoru Tasaka.
    `gem fetch` can fetch of old versions again.  Bug #27960 by Eric Hankins.
    `gem query` and friends output now lists platforms.  Bug #27856 by Greg
    Hazel.
    `gem server` now allows specification of multiple gem dirs for
    documentation.  Bug #27573 by Yuki Sonoda.
    `gem unpack` can unpack gems again.  Bug #27872 by Timothy Jones.
    `gem unpack` now unpacks remote gems.
    --user-install is no longer the default.  If you really liked it, see
    Gem::ConfigFile to learn how to set it by default.  (This change was made
    in 1.3.6)
  RubyGems now has platform support for IronRuby.  Patch #27951 by Will Green.

Bug fixes:

  Require rubygems/custom_require if --disable-gem was set.  Bug #27700 by
  Roger Pack.
  RubyGems now protects against exceptions being raised by plugins.
  rubygems/builder now requires user_interaction.  Ruby Bug #1040 by Phillip
  Toland.
  Gem::Dependency support #version_requirements= with a warning.  Fix for old
  Rails versions.  Bug #27868 by Wei Jen Lu.
  Gem::PackageTask depends on the package dir like the other rake package
  tasks so dependencies can be hooked up correctly.


                                                                                                                                                          • -
RubyGems installed the following executables: /usr/bin/gem1.8 $ gem -v 1.3.7
諸々必要な物のインストール
$sudo gem install newgem
$sudo gem install gemcutter
$sudo gem install rspec

とりあえずこんだけ。

作ってみよう!

$newgem hoge だけでも作れるけど、

$newgem projectname -s -b projectname -T rspec -e "author@email.com" -a "author"

こうしておけば、色々と楽。
Rakefileにauthor(我々の名前)やmailを書いておいてくれます。


んで、今回は雛形のままpushします。

$cd projectname
$rake package 

errorでます、はい。
Rakefileの23行目を

Dir['tasks/**/*.rake'].each { |t| load t }
から
Dir['tasks//*.rake'].each { |t| load t }

にします。
んで、もう一個。
tasks/rspec.rakeの20行目を

t.spec_files = FileList['spec/**/*_spec.rb']
を
t.spec_files = FileList['spec/*_spec.rb']

とします。

これで

$rake package

が成功します。
んで、
pkgディレクトリと、ディレクトリないに

projectname-0.0.1
projectname-0.0.1.tgz
projectname-0.0.1.gem

が、出来ます。
んで

$gem push pkg/projectname-0.0.1.gem
$sudo gem install projectname

これで終わり!
段々疲れて、gdgdになっててすいません。


ちなみに、gemパッケージの名前の付け方

The Ruby Way
第16章 コードのパッケージ化と配布
16.2.2 RubyGmes

 一般的なgemファイルには、短くてわかりやすい一意な名前、ハイフン(-)、標準のバージョン番号からなる名前が付いています。
バージョン番号は、ほぼ世界共通となった「..」形式となっています。