Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

gemとはなんじゃその② 初心者→中級者へのSTEP14/25

gemとはなんじゃその②

はじめに

前回の記事でgemの簡単なイメージが湧きました。簡単なgemの使い方も学びました。
じゃあ今回は自分で簡単なgemを作ってみましょう。

環境

(今まで開発環境のこと書いてなかったです...ごめんなさい)
Ruby 2.3.1
bundler 1.14.6

まずは雛形を作る

適当にディレクトリを作ってそこに作ってみます。bundlerを使えば雛形をコマンド一つて作ってくれます。gemの名前はこちらを参考にしてください。今回は適当にtestgemとしてます。
スクリーンショット 2018-12-14 20.24.59.png
途中でtestではどのgemを使うか、MITは必要か、code of conductは必要か聞かれるので答えましょう。
testはrspecを用い、残りの二つは必要と答えました。MITとcode of conductはオープンソースライセンスと行動規範のことです。作ったgemを公開するなら必要かなと思います。

作成されたものは下記のとおりです。

$ ls -a
.                  .git               .rspec             CODE_OF_CONDUCT.md 
LICENSE.txt        Rakefile           lib                testgem.gemspec
..                 .gitignore         .travis.yml        Gemfile  
README.md          bin                spec

git initも自動でやってくれるみたいですね。LICENSE.txtCODE_OF_CONDUCT.mdは先ほど回答したもの。README.md仕様書も作成されます。前回説明したGemfileもあります。gemを作成する場合、gemの依存関係はgemspecというファイルに記載すべきだそうです。なのでこの段階でGemfileにはgemspecを読み込むように書いてあります。
libの中にはtestgem.rbtestgem/version.rbが入ってます。
このtestgem.rbがgemのコードを定義する主なファイルです。

コード書いてく前に、テスト書いてこう

先のテストにどのgem使う?、に対してrspecと回答したのでgemspecに開発環境でrspecを使うように記述されています。

  spec.add_development_dependency "rspec", "~> 3.0"

ではインストールしましょう。と思ったら、怒られた。

$ bundle install
You have one or more invalid gemspecs that need to be fixed.
The gemspec at /Users/hicom.games/works/asobiba/gemtest/testgem/testgem.gemspec is not valid. Please fix this gemspec.
The validation error was '"FIXME" or "TODO" is not a description'

gemspecの必須記入項目が書かれてねえから書いてくれとのこと。
testなので適当に埋めました。下記の部分です。

Gem::Specification.new do |spec|
  spec.name          = "testgem"
  spec.version       = Testgem::VERSION
  spec.authors       = ["kamo"]
  spec.email         = ["kamo@gmail.com"]

  spec.summary       = %q{this gem is test. by kamo}
  spec.description   = %q{this gem is test. by kamo}
  spec.homepage      = ""
  spec.license       = "MIT"

#~~~~~~~~~~~~~~~略~~~~~~~~~~~~~~~~~~~~~~
end

これでインストールできます。$ bundle installします。

インストールできたらテストを書きましょう。今回のtestgemではありきたりなHello!が出力されるサンプルgemが作れればいいので、テストも簡単です。

testgem_spec.rb
describe Testgem::Greeting do
  it "hello" do
    expect(Testgem::Greeting.greet).to eql("Hello!")
  end
end

コードは基本的にlib/testgem/配下に置いてそれをtestgem.rbで読み込む形にしましょう。

lib/testgem/greeting.rb
module Testgem
  class Greeting
    def self.greet
      "hello"
    end
  end
end

簡単なこんにちわコードです。後はtestgem.rbで読み込みさらに、そのtestgem.rbspec/testgem_spec.rbで読み込むようにします。

testgem.rb
require 'testgem/greeting'
spec/testgem_spec.rb
require 'testgem'

これでプログラムを実行できます。早速テストしてみましょう。

$ bundle exec rspec spec

Testgem
  hello

Finished in 0.00368 seconds (files took 0.0998 seconds to load)
1 example, 0 failures

問題なしですね。

ビルドして公開してみる

今回公開するつもりなかったんでtestgemなんて名前つけたせいで、すでにあるgemと名前が被りリリースできませんでした。
以下、一応リリースの手順です。
まず作ったgemはgithubのリポジトリにあげといてください。
次に公開するためにRrubyGems.orgでアカウントを作り、https://rubygems.org/profile/edit でAPI keyを取得します。
下記のコマンドを叩いてログインします。
curl -u お名前 https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
gemをbuildします

$ rake build
gemの名前 0.1.1 built to pkg/testgem-0.1.1.gem.

リリースします。

$ rake release

これで完了。gem install gemの名前でインストールできます。

まとめ

いつか自作のgem作ってみたいですね。頑張ります。

参考にしたの

【Ruby】gemの作り方から公開まで
https://qiita.com/9sako6/items/72994b8b1c00af4e61fe

guides.rubygems.org
https://guides.rubygems.org/make-your-own-gem/

Developing a RubyGem using Bundler
https://bundler.io/v1.13/guides/creating_gem

gemspecとGemfileの役割をはっきりさせておく
http://sanemat.github.io/archives/langturn.com-translations-33/

Rubyの名前空間とレキシカルスコープについて簡潔に説明する。
https://qiita.com/Drumato/items/ec889d0c3b4b94c67120

gemに投稿してみた
https://qiita.com/siukaido/items/53571e507e2abe592a7f

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
3
Help us understand the problem. What are the problem?