Edited at

RubyGemsの作り方


1: アップデート

# gem自身のアップデート

gem update --system
# bundlerインストール済の場合はアップデート
$ gem update bundler
$ bundler --version


2: ひな形の作成

今回は、ナイーブベイズ(Naive Bayes)に関するgemを作ります。

ディレクトリを前もって作成する必要はありません。

$ bundle gem  jnb_classifier

作成時に何もオプションを指定しなければ、対話形式に以下のことが聞かれます。

・テストは Rspec?  Minitest?

・MITライセンスで良いいよね?

・code of conduct に関するファイルを生成する?

最後の質問に関してはこちらを参照して下さい。

Contributor Code of Conduct

以下のファイルが生成されます。

$ cd /nb_classifier

$ ls
CODE_OF_CONDUCT.md Gemfile LICENSE.txt README.md Rakefile bin lib jnb_classifier.gemspec spec


3: gem_name.gemspec の修正

このファイルの中に"TODO"というワードが含まれているとbundleできない仕組みなので、少なくとも以下の点は書き直す。

jnb_classifier.gemspec

spec.summary       = %q{jnb_classifier helps you classify samples by Naive Bayes.}

spec.description = %q{I will write this section when I finish creating this gem}
spec.homepage = "https://github.com/your_github_acoount/"


4: 実際のコードを記述する

vim lib/jnb_classifier.rb

require 'jnb_classifier/version'

require 'natto'

module bClassifier
# ここにコードを記述します。
end


5:Bundle

今回は、nattoというgemを使うので、jnb_classifier.gemspecに追記します。

spec.add_runtime_dependency `natto`

そして、bundle

$ bundle install --path .bundle

--path .bundleというオプションを指定することで、gemパッケージのインストールの影響をこのディレクトリにとどめています。

※.gemspecにrubyの内部モジュールを指定すると失敗するので注意(open-uriとか)

以下のような表示がされます。

Using rake 10.5.0

Using bundler 1.16.0
Using diff-lcs 1.3
Using nb_classifier 0.1.0 from source at `.`

rakebundlerdiff-lcsの3つはデフォルトのgemで、開発のために必要なdevelopment_dependencyとして、jnb_classifier.gemspecに定義されています。

  spec.add_development_dependency "bundler", "~> 1.16"

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


6:使ってみる

nb_classifierディレクトリ下に、occult.txtcosplay.txtがあるとします。

$ bundle exec irb

$ require 'jnb_classifier'
$ doc_occult = JnbClassifier::Document.new('occult','occult.txt') # 単語頻度の数え上げ(hash)
$ doc_cosplay = JnbClassifier::Document.new('cosplay','cosplay.txt')
$ jnb = JnbClassifier::Classifier.new
$ jnb.learn(doc_occult) # 学習①
$ jnb.learn(doc_cosplay) # 学習②
$ jnb.classify({"ヤクザ"=>1, "人"=>1,"彼女"=>1}) # 分類(結果)

期待通りの動作を確認できたので、gemをビルドして公開します。


7:ビルド

jnb_classifierディレクトリ直下で行います。

$ rake build

パーフェクト Ruby より抜粋


ビルドを行うと作業ディレクトリ直下にpkgディレクトリが作成され、その下にgem_name.gemというファイル名でビルドされたgemパッケージのバイナリファイルが作成されます。


$  gem install pkg/jnb_classifier-0.1.0.gem 

あとは、ローカル環境ではrequire jnb_classifier することで自由に使えます。

今回は、buid => install という風に行いましたが以下のコマンドで同様のことを行えます。

$ rake install

以下のようにrubyのファイルで作成することができます。

test.rb

require 'jnb_classifier'

file_cosplay = "cosplay.txt"
doc_cosplay = JnbClassifier::Document.new("cosplay", file_cosplay)

file_occult = "occult.txt"
doc_occult = JnbClassifier::Document.new("occult", file_occult)

# 学習
yahoo_cat = JnbClassifier::Classifier.new
yahoo_cat.learn(doc_cosplay)
yahoo_cat.learn(doc_occult)
yahoo_cat.learn(doc_occult)
# 分類
test_hash = {"彼女"=>1, "コスプレ"=>1, "伝説"=>1}
puts yahoo_cat.classify(test_hash)

$ ruby test.rb


8: 修正(ビルド後)

ビルドした後にいろいろ修正したい点が出てきた場合についてです。

今回はクラスの名前NaivBayseを初めいろいろ修正したい点が出てきたので以下のプロセスで修正しました。

①作業ディレクトリに戻り修正する

②rake install

とても簡単にできますね。


9: 公開

GitHubと連携して管理するようなので以下のことは前提となります

・GitHubアカウントを持っていること

・magnetohydrodynamical

・GitHub用にSSHキーの設定を行う:GitHubへssh接続する

①rubygems.orgのアカウントを取得

作ったgemをリリースするまで

1.「sign up」からアカウントを作成

2. アカウント作成後、Edit profile(https://rubygems.org/profile/edit) に移動

3. APIアクセス用の鍵を作成(以下のコマンドが用意されている)

コマンド

curl -u your_name https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials

②GitHub上のリモートリポジトリの設定(たぶん必要)

現在の作業用でじレクトリをリモートリポジトリに反映させます

Githubに新規リポジトリ(Repository)を作成する

$ git init

$ git add
$ git commit -m "my first commit"
$ git remote add origin https://github.com/xxxx/sample-repository.git
$ git push origin master

③リリース

あとは、releaseするだけ。

$ bundle exec rake release

おしまい。


ハマりどころ

自分の場合releaseがうまくいかなくって、だいぶハマった。

結論としてはapache logをパースするgemを作ってrubygems.orgに公開してみたと全く同じ状況におちいってしまった。


$ bundle exec rake releaseが終わらねぇ・・


$ cat ~/.gem/credentials

HTTP Basic: Access denied.

となっていた。上記のcurlコマンドが上手く行かなかったらしい。

手動で以下のように設定(APIキーはこのページ:https://rubygems.org/profile/edit)。

~/.gem/credentials

:rubygems_api_key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


頑張りどころ


README.md を書こう

書き方など参照

わかりやすい README 駆動開発

エディタもある便利

Linux Mint 18: マークダウンエディター「Ghostwriter」


参照

RubyGemはめっちゃ簡単に作れる!