2016年9月28日水曜日

独自 Gem の作成方法

概要

かなり既出な情報ですが、Ruby のライブラリ gem を作成する方法をまとめました
とりあえずローカルでインストールするところまでとなります

環境

  • Mac OS X 10.11.6
  • Ruby 2.2.3p173
  • Gem 2.4.5.1
  • Budler 1.11.2
  • Rake 11.2.2

手順

fstlib という gem を作成していきます
今回は bundler と rake を使って作成していくので事前に作成しておいてください

雛形の作成

  • bundle gem fstlib

一番初めだけ「テストの方式」「公開時のライセンス形態」「コード規約を含めるか」を聞かれます
基本は全部デフォルトのままで OK です
問題なく作成できれば以下のファイル群が作成されます

Creating gem 'fstlib'...
MIT License enabled in config
Code of conduct enabled in config
      create  fstlib/Gemfile
      create  fstlib/.gitignore
      create  fstlib/lib/fstlib.rb
      create  fstlib/lib/fstlib/version.rb
      create  fstlib/fstlib.gemspec
      create  fstlib/Rakefile
      create  fstlib/README.md
      create  fstlib/bin/console
      create  fstlib/bin/setup
      create  fstlib/LICENSE.txt
      create  fstlib/CODE_OF_CONDUCT.md

続いてメタ情報を修正していきます

  • cd fstlib
  • vim fstlib.gemspec

TODO となっている箇所を修正します

spec.authors       = ["hawksnowlog"]
spec.email         = ["hawksnowlog@gmail.com"]
spec.homepage      = "http://hawksnowlog.blogspot.com/"

...

spec.summary       = %q{This gem is a test.}
spec.description   = %q{This gem is a test.}

allowed_push_host の設定の部分は https://rubygems.org/ 以外で gem を公開するときに設定が必要になるので、不要な場合は行を削除してください

# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
# delete this section to allow pushing this gem to any host.
if spec.respond_to?(:metadata)
  spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
else
  raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
end

最低限の設定は以上で OK です

ライブラリの作成

では、実際に独自のライブラリを作成していきましょう

  • vim lib/fstlib.rb
require "fstlib/version"

module Fstlib
  def self.hello
    "Hello in Fstlib"
  end
end

「Hello in Fstlib」と表示するだけの hello という関数を定義しました

irb で動作確認

gem ファイルにする前に一旦 irb コマンドで動作確認できます

  • bundle exec irb
irb(main):001:0> require 'fstlib'
=> true
irb(main):002:0> Fstlib.hello
=> "Hello in Fstlib"

こんな感じになれば問題ないので gem の形にしていきます

ビルド

  • rake build
  • ls pkg/
fstlib-0.1.0.gem

rake -T でタスクの一覧を確認することができます
pkg 配下に gem が作成されれば OK です

インストール

ビルドして作成できた gem ファイルをローカルからインストールします

  • gem install -l pkg/fstlib-0.1.0.gem
Successfully installed fstlib-0.1.0
Parsing documentation for fstlib-0.1.0
Installing ri documentation for fstlib-0.1.0
Done installing documentation for fstlib after 0 seconds
1 gem installed
  • gem list | grep fstlib
fstlib (0.1.0)

こんな感じでインストールすることができます

動作確認

  • irb
irb(main):001:0> require 'fstlib'
=> true
irb(main):002:0> Fstlib.hello
=> "Hello in Fstlib"

今度は bundler 経由で irb を実行しないでも require することができるようになりました

Tips

バージョンアップする

  • vim lib/fstlib/version.rb
module Fstlib
  VERSION = "0.1.1"
end

で再度ビルドすれば「fstlib-0.1.1.gem」というファイルが作成されます

依存ライブラリを定義する

  • vim fstlib.gemspec
spec.add_runtime_dependency 'sinatra'

と 1 行追加しましょう
すると lib/fstlib/version.rb の中で require "sinatra" できるようになります

最後に

ローカルで gem を作成してインストールする方法を紹介しました
次回はアカウントを作成して rubygems で公開するところまでやってみたいと思います

参考サイト

1 件のコメント:

  1. 一点はまったのですが rake build して作成される gem に含まれる対象のファイルは git commit 済みのものだけになります
    なので新規にファイルを追加した場合には必ず git commit してから rake build してください
    gem を作成したのに unpack すると中身にファイルがない状態になってしまいかなりハマリました、、、

    返信削除