How to make gem
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
404
On Slideshare
402
From Embeds
2
Number of Embeds
1

Actions

Shares
Downloads
1
Comments
0
Likes
1

Embeds 2

https://cybozulive.com 2

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. How to make gem ライブラリの作り方
  • 2. 最初に必要なもの  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)
  • 3. 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 ライブラリのメタデータや設定を定義するファイル
  • 4. ひな形の作成 以下のコマンドでライブラリのひな形を作成 $ 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
  • 5. 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
  • 6. 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のライブラリ探索パス)に追加するディレクトリ。
  • 7. 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 “ライブラリ名” : 開発時に必要な依存関係の定義。
  • 8. 依存ライブラリのインストール ライブラリのルートディレクトリに移動して以下のコマンドを実行する。 $ bundle install --path .bundle     .bundleというディレクトリが作成される。 .bundle/configはbundleの設定ファイルで2回目以降はオプションの指定が不要。 .bundle/rubyに依存関係のライブラリがインストールされる。 .bundle/rubyにインストールされたライブラリは他のシステムに影響を与えない。 .bundle/rubyにインストールされたライブラリのコマンドはbundle execを付け る事で実行する事が可能。(rspecは例) $ bundle exec rspec
  • 9. テストコードの作成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
  • 10. テストコードの作成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
  • 11. 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
  • 12. テストの実行 テストを実行してみる。 $ 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)
  • 13. ライブラリの実装 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"
  • 14. テストの再実行 テストを再度実行する。 $ 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」なのでテスト成功。
  • 15. 実行ファイルの追加 binディレクトリとコマンドの作成 $ mkdir bin $ touch bin/sample $ chmod 755 bin/sample コマンドを実装。 #!/usr/bin/env ruby require "sample" puts Sample::Foo.new.greet 今回は実行ファイルのテストは書かないが、実際はテストした方が良い。
  • 16. 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
  • 17. コマンドの実行  インストールしていない場合 $ ruby -I lib bin/sample Hello World  rake installした場合 $ bundle exec sample Hello World  gem install -l sampleした場合 $ sample Hello World
  • 18. Fin