SlideShare ist ein Scribd-Unternehmen logo
1 von 18
How to make gem
ライブラリの作り方
最初に必要なもの
 Ruby
$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-darwin13.0.0]

 gem (Ruby標準添付)
$ gem -v
2.1.11

 bundler
$ gem install bundler
$ bundle –v
Bundler version 1.5.2

 Git
$ git –-version
git version 1.8.3.4 (Apple Git-47)
Gemの主要ファイル構成
Path

Description

bin

実行可能ファイル配置パス
ここに配置されたファイルが実行ファイルとして配置される

lib

このディレクトリが$(Rubyライブラリの探索パス)に追加される
sample
(ライブラリ名)

sample.rb
spec

lib/sample.rbからrequireするファイル群を配置

require “sample”でロードされるファイル

version.rb

バージョンを記載するファイル

テスト用のを格納するディレクトリ(RSpecの場合)
spec_helper.rb

Rspecの共通設定を定義するファイル

Gemfile

bundlerで依存解決を解決する為の設定ファイル

Rakefile

rakeタスクの定義ファイル

sample.gemspec

ライブラリのメタデータや設定を定義するファイル
ひな形の作成
以下のコマンドでライブラリのひな形を作成
$ bundle gem sample
create sample/Gemfile
create sample/Rakefile
create sample/LICENSE.txt
create sample/README.md
create sample/.gitignore
create sample/sample.gemspec
create sample/lib/sample.rb
create sample/lib/sample/version.rb
gemspecの編集1
ライブラリのメタデータを入力する。(以下はsample.gemspecの一部)
Gem::Specification.new do |spec|
spec.name
= "sample"
spec.version
= Sample::VERSION
spec.authors
= ["i2bskn"]
spec.email
= ["i2bskn@gmail.com"]
spec.summary
= %q{Sample library}
spec.description = %q{Gem for first time.}
spec.homepage
= "https://github.com/i2bskn/sample"
spec.license
= "MIT”
# snip
end
gemspecの編集2
ライブラリの設定を入力する。(以下はsample.gemspecの一部)
今回は変更しない。
Gem::Specification.new do |spec|
# snip
spec.files
= `git ls-files -z`.split("x0")
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
# snip
end





files : 全てのファイルの配列。
executables : 実行ファイル名の配列。bin以外の場所に配置する場合は変更。
test_files : テスト用ファイルの配列。test,spec,features以外に配置する場合は変更
require_paths : $:(Rubyのライブラリ探索パス)に追加するディレクトリ。
gemspecの編集3
ライブラリの依存関係にRSpecを追加する。(以下はsample.gemspecの一部)
RSpec以外も必要な場合は適宜追加する。
Gem::Specification.new do |spec|
# snip
spec.add_development_dependency "bundler", "~> 1.3"
spec.add_development_dependency "rake"
spec.add_development_dependency "rspec"
end

 add_dependency “ライブラリ名” : 実行時に必要な依存関係の定義。
 add_development_dependency “ライブラリ名” : 開発時に必要な依存関係の定義。
依存ライブラリのインストール
ライブラリのルートディレクトリに移動して以下のコマンドを実行する。
$ bundle install --path .bundle





.bundleというディレクトリが作成される。
.bundle/configはbundleの設定ファイルで2回目以降はオプションの指定が不要。
.bundle/rubyに依存関係のライブラリがインストールされる。
.bundle/rubyにインストールされたライブラリは他のシステムに影響を与えない。

.bundle/rubyにインストールされたライブラリのコマンドはbundle execを付け
る事で実行する事が可能。(rspecは例)
$ bundle exec rspec
テストコードの作成1
テスト用ディレクトリとspec_helper.rbの作成
$ mkdir -p spec/sample
$ touch spec/spec_helper.rb

spec_helper.rbのコードを記述する。
require “sample”
RSpec.configure do |config|
config.order “random”
end
テストコードの作成2
テストコードの作成
$ touch spec/sample/foo_spec.rb

ここではRSpecの解説は省きます。
require "sample"

describe Sample::Foo do
describe "#greet" do
it "returns greeting message" do
expect(Sample::Foo.new.greet).to eq("Hello World")
end
end
end
Rakefileの編集
Rakefileにテストを実行するタスクを定義してデフォルトタスクにする。
require "bundler/gem_tasks"
require "rspec/core/rake_task"
desc "Run all specs"
RSpec::Core::RakeTask.new(:spec) do |t|
t.rspec_opts = ["-c", "-fs"]
end
task :default => :spec
テストの実行
テストを実行してみる。
$ bundle exec rake spec
/path/to/ruby -S rspec ./spec/sample/foo_spec.rb -c –fs
/path/to/sample/spec/sample/foo_spec.rb:3:in `<top (required)>': uninitialized constant
Sample::Foo (NameError)

Sample::Fooクラスが定義されていない為、NameErrorがthrowされる。
rakeタスクでなくrspecコマンドでも実行可能。
$ bundle exec rspec
/Users/iiboshiken/work/sample/spec/sample/foo_spec.rb:3:in `<top (required)>':
uninitialized constant Sample::Foo (NameError)
ライブラリの実装
Sample::Fooクラスの作成。
$ touch lib/sample/foo.rb
module Sample
class Foo
def greet
"Hello World"
end
end
end

Sample::Fooクラスをsample.rbからrequireする。(以下はlib/sample.rb)
require "sample/version"
require "sample/foo"
テストの再実行
テストを再度実行する。
$ bundle exec rake spec
/path/to/ruby -S rspec ./spec/sample/foo_spec.rb -c -fs
Sample::Foo
#greet
returns greeting message
Finished in 0.00252 seconds
1 example, 0 failures

「1 example, 0 failures」なのでテスト成功。
実行ファイルの追加
binディレクトリとコマンドの作成
$ mkdir bin
$ touch bin/sample
$ chmod 755 bin/sample

コマンドを実装。
#!/usr/bin/env ruby
require "sample"
puts Sample::Foo.new.greet

今回は実行ファイルのテストは書かないが、実際はテストした方が良い。
Commitとビルド
ひと通り実装したのでコミットしておく。
リモートリポジトリが無い場合はpushしなくてもよい。
$ git add --all
$ git commit -m “first commit”
$ git push -u origin master

ビルドしてインストールする。
$ bundle exec rake build
$ bundle exec rake install

グローバルにインストールする場合はgemコマンドを使う。
$ bundle exec rake build
$ cd pkg
$ gem install -l sample
コマンドの実行
 インストールしていない場合
$ ruby -I lib bin/sample
Hello World

 rake installした場合
$ bundle exec sample
Hello World

 gem install -l sampleした場合
$ sample
Hello World
Fin

Weitere ähnliche Inhalte

Was ist angesagt?

R以外の研究ツール
R以外の研究ツールR以外の研究ツール
R以外の研究ツール
弘毅 露崎
 
Fabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしようFabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしよう
max747
 
serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?
Sho Hashimoto
 
2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる
airtoxin Ishii
 

Was ist angesagt? (20)

PostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツールPostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツール
 
R以外の研究ツール
R以外の研究ツールR以外の研究ツール
R以外の研究ツール
 
データベースのお話
データベースのお話データベースのお話
データベースのお話
 
Capistrano
CapistranoCapistrano
Capistrano
 
オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介
オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介
オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介
 
Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4
 
OSC東京2013/Spring_JPUG資料
OSC東京2013/Spring_JPUG資料OSC東京2013/Spring_JPUG資料
OSC東京2013/Spring_JPUG資料
 
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅- Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
 
Openstack+Ceph設定ガイド
Openstack+Ceph設定ガイドOpenstack+Ceph設定ガイド
Openstack+Ceph設定ガイド
 
Version管理 1
Version管理 1Version管理 1
Version管理 1
 
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
 
ぼくの考えた最強のpipeline構成
ぼくの考えた最強のpipeline構成ぼくの考えた最強のpipeline構成
ぼくの考えた最強のpipeline構成
 
Cephのベンチマークをしました
CephのベンチマークをしましたCephのベンチマークをしました
Cephのベンチマークをしました
 
Fabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしようFabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしよう
 
New configurationoferogamescaperev3
New configurationoferogamescaperev3New configurationoferogamescaperev3
New configurationoferogamescaperev3
 
serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?
 
lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)
 
2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる
 
Hadoop on LXC
Hadoop on LXCHadoop on LXC
Hadoop on LXC
 
core.async+transducers Shibuya.lisp #21
core.async+transducers Shibuya.lisp #21core.async+transducers Shibuya.lisp #21
core.async+transducers Shibuya.lisp #21
 

Ähnlich wie How to make gem

コード読経会報告書
コード読経会報告書コード読経会報告書
コード読経会報告書
Masahiko Toyoshi
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
Goh Matsumoto
 
(工事中) Git の仕組み
(工事中) Git の仕組み(工事中) Git の仕組み
(工事中) Git の仕組み
Teloo
 
はじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリはじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリ
Masahiro Tomita
 
20130328 第03回福岡debian勉強会 debianパッケージ情報と依存関係の可視化
20130328 第03回福岡debian勉強会   debianパッケージ情報と依存関係の可視化20130328 第03回福岡debian勉強会   debianパッケージ情報と依存関係の可視化
20130328 第03回福岡debian勉強会 debianパッケージ情報と依存関係の可視化
Tsuyoshi Yamada
 

Ähnlich wie How to make gem (16)

Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19
 
Ruby In Wheezy
Ruby In WheezyRuby In Wheezy
Ruby In Wheezy
 
コード読経会報告書
コード読経会報告書コード読経会報告書
コード読経会報告書
 
Debian パッケージングチュートリアル
Debian パッケージングチュートリアルDebian パッケージングチュートリアル
Debian パッケージングチュートリアル
 
Mac_Terminal_ver1.0
Mac_Terminal_ver1.0Mac_Terminal_ver1.0
Mac_Terminal_ver1.0
 
Git (実践入門編)
Git (実践入門編)Git (実践入門編)
Git (実践入門編)
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
 
Ruby in Wheezy @ 関西闇Ruby
Ruby in Wheezy @ 関西闇RubyRuby in Wheezy @ 関西闇Ruby
Ruby in Wheezy @ 関西闇Ruby
 
(工事中) Git の仕組み
(工事中) Git の仕組み(工事中) Git の仕組み
(工事中) Git の仕組み
 
Java 7
Java 7Java 7
Java 7
 
LinAction Theme LPICの問題を解いてみる~インストールとパッケージ管理編~
LinAction Theme LPICの問題を解いてみる~インストールとパッケージ管理編~LinAction Theme LPICの問題を解いてみる~インストールとパッケージ管理編~
LinAction Theme LPICの問題を解いてみる~インストールとパッケージ管理編~
 
Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編
 
Management of Gems using Bundler.
Management of Gems using Bundler.Management of Gems using Bundler.
Management of Gems using Bundler.
 
はじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリはじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリ
 
20130328 第03回福岡debian勉強会 debianパッケージ情報と依存関係の可視化
20130328 第03回福岡debian勉強会   debianパッケージ情報と依存関係の可視化20130328 第03回福岡debian勉強会   debianパッケージ情報と依存関係の可視化
20130328 第03回福岡debian勉強会 debianパッケージ情報と依存関係の可視化
 
Git 実践入門
Git 実践入門Git 実践入門
Git 実践入門
 

Kürzlich hochgeladen

Kürzlich hochgeladen (11)

Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

How to make gem