0
0

bundlerを使ったgemの作り方、公開方法

Posted at

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にコピーしておきます。一部加筆しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0