大学生がプログラマーを目指すはなし

ruby初心者の自分が忘れないためのレポート

Rubyでgemを作って公開するまで

0. 準備

まずは準備のためにgemのアップデートとbundlerのアップデートを行います。

# gem自信のアップデート
gem update --system

# bundler未インストールの場合はインストール
gem install bundler

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

 

1. ヒナ形の作成

今回はtest_gemという名前のGemを制作していきます。

※実際にRubyGemsで公開する場合はまだ存在していないGem名にしないといけません。

# test_gemのひな形を作成(Rspec付き)
bundle gem test_gem --exe -t

2. 作成されたファイルの確認

今回作成されたファイルの簡単な説明。

bundle gem test_gem -t
  create  test_gem/Gemfile
  create  test_gem/Rakefile
  create  test_gem/LICENSE.txt
  create  test_gem/README.md => このgemの説明や使い方を記述
  create  test_gem/.gitignore
  create  test_gem/test_gem.gemspec => このgemの説明や依存関係などを記述
  create  test_gem/lib/test_gem.rb => プログラムを記述
  create  test_gem/lib/test_gem/version.rb => このgemのバージョン情報を記述
  create  test_gem/.rspec
  create  test_gem/spec/spec_helper.rb
  create  test_gem/spec/test_gem_spec.rb
  create  test_gem/.travis.yml => travisを使う際の設定を記述
    create   test_gem/exe/test_gem => 実行コマンドを追加する際に記述

3. test_gem.gemspecの修正

test_gem.gemspecの中身は以下のようにになっています。

# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'test_gem/version'

Gem::Specification.new do |spec|
spec.name = 'test_gem'
spec.version = TestGem::VERSION
spec.authors = ['kubota-ryotaro']
spec.email = ['kubota@mail.com']
spec.summary = %q{TODO: Write a gem summary}
spec.description = %q{TODO: Write a gem description}
spec.homepage = 'http://namae.github.io'

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']

spec.add_development_dependency 'bundler', '~> 1.7'
spec.add_development_dependency 'rake', '~> 10.0'
spec.add_development_dependency 'rspec'
end

最低限修正が必要な部分を抜き出すと次のようになります。

# このgemの説明をダブルクオートで囲って書き直す
spec.summary       = "Make gem for summary."
spec.description   = "Make gem for description."

# このgemのHomepageを書く(GitHubのURLを入れてください) spec.homepage = "https://github.com/kubota-ryotaro/"
# 依存するgemが存在する場合のみ、次のように指定 spec.add_dependency 'xxxx', '~>x.x' # 開発時だけに必要な依存gemが存在する場合のみ、次のように指定 spec.add_development_dependency 'yyyy', '~>y.y'

4. Gemの実装

今回はテスト的にHello World!と出力するようにします。lib/test_gem.rbを開いて次のように変更します。

require 'test_gem/version'

module TestGem
def self.greet
'Hello World!'
end
end

5. 実行してみよう

では先ほど作成したgemを実行してみます

# gem のインストール
bundle install

# rubyの対話型インタプリタを起動
bundle exec irb [2.1.4]
irb(main):001:0> require 'test_gem'
=> true

irb(main):002:0> TestGem.greet
Hello World!

ということで無事実行できました!

6. RSpecを書こう

先ほどのTestGem.greetのテストをRSepcで書いていきます。spec/test_gem_spec.rbを次のように書き換えます。

require 'spec_helper'

describe TestGem do
it 'has a version number' do
expect(TestGem::VERSION).not_to be nil
end

describe '#greet' do
it 'returns "Hello World!"' do
expect(TestGem.greet).to eq('Hello World!')
end
end
end

7. 実行コマンドを追加

コンソール上でtest_gemというコマンドを使うとgemの内容を実行できるようにしたいので、exe/test_gemに次を書いていきます。

#!/usr/bin/env ruby

require 'test_gem'

puts TestGem.greet

8. Gemをパッケージ化する。

次にGemをパッケージ化します。コマンドとしては、gem build test.gemspecです。

gem build test_gem.gemspec
=> Successfully built RubyGem
=> Name: test_gem
=> Version: 0.0.1
=> File: test_gem-0.0.1.gem
gem install test_gem
=> Successfully installed test_gem-0.0.1
=> 1 gem installed
test_gem
=> "Hello World!"

9. 公開

GitHubと連携して管理するようなので以下のことは前提となります
GitHubアカウントを持っていること
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にgem名と同じ名前の新規リポジトリを作成する

git init$
git add -A
git commit -m "initial commit"
git remote add origin https://github.com/namae/test_gem.git

git push --set-upstream origin master

③リリース
あとは、releaseするだけ。

bundle exec rake release

 

これでできたはず!

 

 

rakeの基本

前提 rubyプログラムの中でC言語コンパイルして実行する。
1. まず最初に適当な作業ディレクトリを作成し、そこにRakefileを作る。

ここでお約束的な感じでRakefileの頭文字は大文字にしておく。

2. 今回使用するC言語プログラムを作っておく。

今回実行するプログラムはamidakuji.c

3. RakefileにCプログラムをビルドして実行するためのコードを書いていく。

f:id:rk0822ps4:20180707155733p:plain

 $ rake としたらdefaultでamidakujiが呼ばれるようにしておく。

4~6行目で実行プログラムで、8~10行目でビルドだ。

このように芋ずる式で書いていくと良い。

$ rake

で実行できる。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8時間かけて作ったソースファイル達を rm ./* してしまった。

2日かけて計8時間ほどかけて作ったプログラムがありました。

それをGitHub上にpushしようと思ったんですよね。

だからまずローカルの作業用ディレクトリからpush用のディレクトにコピーしました。そしてそこで一応中身を確認していたら一部気に入らない箇所があり、もう一度作業用ディレクトリの中で訂正しようと思ったんですよね。んで、そのファイル達を一旦消したんですよね。

そしたら...

 

「あれ?」

作業用ディレクトリの中にさっきまで開いていたファイルがないお??

あれ、どこ行ったんだろ...

 

...

.......

「どっこにもねぇ」

 

 

コマンドの履歴を確認してみたところ作業用ディレからpush用ディレにmvしていたようでした。

そして移動させたファイルを綺麗に削除したみたいでした。

 

解決策は基本的になく、もう一回作り直すしかないらしい...。゚(゚´ω`゚)゚。

 

 

その後誰かに聞いたら「そのためのgitじゃね? コミットしーや。」

とのことで解決しましたとさ。

 

debianで使うaptコマンド

aptの基本的なコマンド

debian初心者の自分がメモしたコマンドです。

アプリケーションのインストール、アンインストール、アップデートを行うコマンド

# apt install name

# apt remove name

# apt update name

 

Rake taskでコマンドラインから複数引数を指定する方法

1. taskを作成してみる。

$rake g task file_name

file_nameにてきとうな名前をつける。
すると、rails/lib/task/ に以下のようなファイルが作成される。

file_name.rake
namespace :file_name do
end

 

2. taskに処理を書いてみる。

file_name.rake
namespace :file_name do
  task practice do
print "hello" end end

これで保存する。

 

3. rake taskを確認してみる。

$ rake -vT

# 出力結果
...
rake file_name:practice
...

 こう出力されれば作成されている。

 

4. 実行してみる。

$ rake file_name:practice

# 出力結果
hello

 ここまでくればとりあえず完成である。

 

5. Rake taskでコマンドラインから複数引数を指定する方法

5-1. 概要

rakeコマンド実行時にコマンドラインから複数の引数を入力として受け取るには主に2つの方法があります。

  1. taskを複数定義する。
  2. 環境変数を複数定義する。

5-2. taskを複数定義する。

例えば、

task :practice, 'firstname', 'lastname'

task :practice do |i, args|

  puts "My name is  #{args['first_name']} #{args['last_name']}"

end

 として、実行してあげると

$ rake file_name:practice[Ryotaro,Kubota]

 

# 出力結果

My name is Ryotaro Kubota 

とできる。

5-3. 環境変数を複数定義する

例えば、

task :practice do |t|

  puts "My name is #{ENV['first_name']} #{ENV['last_name']}"

end

 として、実行してあげると

$ rake file_name:practice first_name=Ryotaro last_name=Kubota

# 出力結果

My name is Ryotaro Kubota 

とできる。

 

6. どっちがいいの?

僕がまだ初心者でどっちでもいいと思ってしまいますが、強いていうなら環境変数の方が好きかもしれないです。

なぜならtaskを繋げてたくさん書いていくとrake -vTで確認したときに、横にたくさん連なって色々見辛くなります(笑)

$ rake -vT

# 出力結果
...
rake file_name:practice,'sample1','sample2','sample3','sample4'...
...

 こうなっちゃうとdescで説明したところが右側に追いやられてしまうんですよね...

何か良い方法があれば別ですが...

 

 

gsub!を使いこなす

基本的な構文

html1 = "My name is ひかる"

html.gsub!("My name is", "私の名前は")

print html1

出力→私の名前はひかる

 

file.puts時などにダブルクオートをエスケイプしたいとき

html2 = " \"text\" text\\\"text\\\"text "

print html2

出力→"text" text\"text\"text 

このように

\"→"

\\\"→\"

となる。

 

まず、"→\"と置換してみる。

html2 = " \"text\" text\\\"text\\\"text "

 html2.gsub!('"', '\\"')

print html2

出力→\"text\" text\\"text\\"text 

 

\\"があるのでこれも\"にしたい。

なのでさらに置換する。

html2 = " \"text\" text\\\"text\\\"text "

html2.gsub!('"', '\\"')

html2.gsub!('\\\"', '\\"')

print html2

出力→\"text\" text\"text\"text 

 

これで綺麗にエスケイプされて出力できた。

Terminalの基本を覚える

/bin, /usr/bin ここのディレクトリにpathを通したコマンドがある。
env
環境変数の一覧を見ることができる。
echo
→echo $USERなどと打つと中身が確認できる便利なコマンド
curl http://example.com -o foo.html
→URLからファイルをダウンロードできる。
open
→とにかく開くコマンドだが、引数を.とした場合、カレントディレクトリをfinderで開ける。
brew search tree
brewはsearch, install, uninstallといったサブコマンドと言われる引数を最初に指定します。

↓shコマンドで作業を自動化するときや、環境変数について参考にする。http://fjord.jp/articles/655.html