Rubyのgemパッケージを作成する手順について。bundlerにgem作成を助ける機能がいくつかあるので利用する。
ひな形の作成
bundle gemでひな形を生成する。
$ bundle gem mylib
gemspecは各gemごとに適当に修正する。ひな形を見ればすぐに内容はわかる。
依存ライブラリ
依存ライブラリはGemfileではなくgemspecファイルに記述して、Gemfileからはgemspecを参照するだけにする。
Gemfile
source 'https://rubygems.org'
gemspec
mylib.gemspec
Gem::Specification.new do |spec|
...
spec.add_runtime_dependency "hashie"
spec.add_runtime_dependency "json"
spec.add_development_dependency "bundler"
spec.add_development_dependency "rake"
end
ビルド
gem buildコマンドでビルド。
$ gem build mylib.gemspec
bundleでひな形を作っている場合は、rake buildでpkgフォルダにgemパッケージが作成される。
$ rake build
公開
gem pushコマンドで公開。このとき、rubygems.orgのアカウントが必要。
$ gem push mylib-x.x.x.gem
同様にbundleでひな形を作っている場合は、rake releaseリリースできる。
$ rake release
トラブルシュート
コミット忘れ
ビルド対象になっているファイルを変更しているのにも関わらずコミットしていない状態でrake buildすると以下のようにエラーになる。コミットしてからビルドする。
$ rake build
rake aborted!
Running `gem build -V /path/to/dupler.gemspec` failed with the following output:
WARNING: See https://guides.rubygems.org/specification-reference/ for help
ERROR: While executing gem ... (Gem::InvalidSpecificationException)
["uncommitted.file"] are not files
Tasks: TOP => build
(See full trace by running task with --trace)
依存性問題
duplerというCLIツールを公開しているが、これの0.2.0を公開した時、Rubygemsには正しくpushできるのにgem installで公開したはずのバージョンがインストールできない問題が発生した。gemspecのdependencyの設定で依存ライブラリーのバージョン番号を指定しないでいたところ、ローカルでのビルドは問題なく、.gemファイルからのローカルインストールも問題なかったのでそのままRubygemsにpushした。そこから改めてgem installすると、公開したはずの0.2.0ではなく古い0.1.0がインストールされてしまう。試しにgem update duplerを実行すると、以下のようなエラーとなっていた。
gem update dupler
Updating installed gems
Updating dupler
ERROR: Error installing dupler:
Unable to resolve dependency: user requested 'dupler (= 0.2.0)'
Nothing to update
具体的に問題となっているライブラリーについてはこのメッセージからはわからないが、依存性の解決に失敗しているらしい。仕方がないのでgemspecに記載している依存ライブラリーについて、全て利用しているバージョンを具体的に指定したところ問題なくRubygemsからgemコマンドでインストールできるようになった。
備考
この記事は2013年(!)にBloggerに書いたものの写しです。自分で見返す必要があったのでQiitaにコピーしておきます。一部加筆しています。