QA@IT

Rubyのライブラリをrubygemsとして公開するには?

3632 PV

Rubyでとても便利なライブラリを開発したので、ぜひみんなに使ってもらいたいと思っています。どうすれば

gem install my_ruby_gem

として公開 / 配布できるのでしょうか?

回答

今新規で作るなら bundle gem 一択。

公開も gem push で一発だし、とても楽になりましたね…

編集 履歴 (1)

Gemを作るためのサポートツールは複数あるうえに流行り廃りがあって選択に迷いますが、今ならBundlerを使うのが一番安定していて、将来性もあるとおもいます。BundlerはGem作成以外の用途でも必須になっていますからね。

ライブラリを一般的なディレクトリ構成にしておけば、開発者がやることはgemspecのメタ情報入力程度で、ごく少ないです(Convention over Configurationですね)。

さらにBundlerでgemを構築するといっしょにRakefileを作ってくれますが、おかげでversion.rbを修正して「rake release」するだけでrubygems.orgへの公開まで一発でやってくれるのでリリース作業がとても楽です。

手順は以前、日記に書いたのでそちらをどうぞ:

Bundlerを使ったGem作成メモ (自分用)

編集 履歴 (0)

rubygems.org にgemファイルをpushすることで公開できます。gemコマンドを適切に使うことで可能なのですが、いろいろとコツが必要なのでツールに頼るのが近道です。いくつか種類がありますが、ここではrubygemのテンプレートから作成してくれる hoe を使った方法を紹介します。

ここでは「pebbles-compgacha」というプロジェクトを作成し、rubygems.orgで公開するまでの流れを見てみましょう。

hoeのインストール

$ gem install hoe

プロジェクトの作成

新規作成

sowコマンドでテンプレートを作成します。

$ sow pebbles-compgacha

erbコマンドでテンプレートが展開されたあと、自分で修正すべき箇所が「FIX」として表示されます。これらを埋めてから次に進みましょう。

... done, now go fix all occurrences of 'FIX':

  pebbles-compgacha/Rakefile:18:  # developer('FIX', 'FIX@example.com')
  pebbles-compgacha/README.txt:3:* FIX (url)
  pebbles-compgacha/README.txt:7:FIX (describe your package)
  pebbles-compgacha/README.txt:11:* FIX (list of features or problems)
  pebbles-compgacha/README.txt:15:  FIX (code sample of usage)
  pebbles-compgacha/README.txt:19:* FIX (list of requirements)
  pebbles-compgacha/README.txt:23:* FIX (sudo gem install, anything else)
  pebbles-compgacha/README.txt:38:Copyright (c) 2012 FIX

Rakefileにはいろんなコメントがありますが、不要なものは全部消しましょう。rubyforge_nameも通常は設定する必要はありません。

$ cd pebbles-compgacha
$ rake -T

rakeタスクの一覧が表示されることを確認しましょう。

コードの実装

gem自体がどんなものかはここでは本質ではないので、githubのコード をご覧ください。

test/test_pebbles_compgacha.rb

テンプレートから作成したテストコードは、Ruby1.9系ではそのまま動きません。とはいえ放置したままだと膝に矢を受けてしまいますので、最低限のテストを書いて動くようにしておきます。

$: << File.join(File.dirname(File.expand_path(__FILE__)), %w(.. lib))
require "pebbles/compgacha"

require "minitest/unit"
MiniTest::Unit.autorun

class TestPebblesCompgacha < MiniTest::Unit::TestCase
  def test_to_resopond_method
    assert Pebbles::Compgacha.respond_to?(:complete)
  end
end

変更点としては…

  • Ruby1.9にはtest/unitが添付されていません。標準添付のminitest/unitを使うようにしました。
  • テストクラス名が「TestPebbles::Compgacha」と名前空間を含んでしまうため、「::」を削除しました。

.autotestも生成されているため、ZenTestをインストールすればファイルの変更を監視してテストを実行してくれます。

$ gem install ZenTest
$ autotest

rubygemsに登録

アカウントを取得

RubyGems.org の 「Sign up」からアカウントを作成します。

パッケージを生成

rakeタスクでパッケージを作ります。

$ rake package

しかし、今回の手順そのままで作成していると失敗するでしょう。rakeコマンドに「--trace」オプションをつけて実行し、失敗の原因を特定しましょう。

ちなみに今回は、テンプレートが作成したファイル名と、Manifest.txtに記述されたパッケージに含めるファイル名が違っているのが原因でした。Manifest.txtを修正し、pkg/pebbles-compgacha-0.1.0.gem が生成されたら準備OKです。

rubygems.orgにリリース

問題なさそうならリリース作業を行いましょう。

$ rake release_to_gemcutter VERSION='0.1.0'

バージョン番号をつけるのは「最終チェック」の意味があるそうです。lib/pebbles/compgacha.rbのクラス定数「VERSION」と同じものを入力しましょう。History.txtの記述ともそろえておいた方がいいでしょう。

また、初回はrubygemsアカウントのメールアドレスとパスワードを聞かれます。普通に入力しても構いませんし、Edit Profile の「API Access」に書いてある手順でAPI Keyを取得しておけば省略することもできます。API Keyは~/.gem/credentialsに保存されます。

確認

しばらく待つとgemコマンドでインストールできるようになります。確認してみましょう。

$ gem search -r pebbles-compgacha

*** REMOTE GEMS ***

pebbles-compgacha (0.1.0)

おめでとう!多くの人に使ってもらえるといいですね。

その他

rubygemsのネーミングルールについて

RubyGemsの開発者であるEric Hodel氏が推奨しているのは…

  • - (ハイフン) : パスの区切り
  • _ (アンダースコア) : 単語の区切り

というネーミングルールです。特別な理由がない限り従うべきでしょう。具体例はブログエントリを参考にしてください。

そもそもpebblesってなによ?

pebblesとは、rubygemsにおけるジョーク用名前空間として回答者が個人的に提唱しているネーミングルールで、RubyKaigi2011でLightning Talksとして提案してきました。よろしければお使いください。

編集 履歴 (2)
ウォッチ

この質問への回答やコメントをメールでお知らせします。