Software engineering notes

Ruby Gem

Install Gem on Ubuntu

[1] Update & Upgrade

sudo apt-get update
sudo apt-get upgrade -y

[2] Install RVM (Ruby Version Manager)

Install curl (MacOS doesn’t need to execute this)

sudo apt-get install curl

Install RVM

\curl -sSL https://get.rvm.io | bash -s stable

讀取 rvm

source ~/.rvm/scripts/rvm

安裝 rvm 自己相依的東西

rvm requirements

[3] Install Ruby

rvm install ruby
rvm use ruby --default

[4] Install RubyGems

rvm rubygems current

Gem commands

Gemfile 版本符號代表意義

gem 'rails', '4.2.6'

Make a ruby gem

建立 gem 的基本結構

test@virtualBox:/tmp$ bundle gem exgem
      create  exgem/Gemfile                    <= 描述 dependency
      create  exgem/Rakefile                   <= 發佈和打包的 rake tasks
      create  exgem/LICENSE.txt                <= 註明 License
      create  exgem/README.md                  <= 簡單說明如何使用它
      create  exgem/.gitignore                 <= 不要進 Git 的檔案在這定義
      create  exgem/exgem.gemspec             <= gem 的 spec
      create  exgem/lib/exgem.rb              <= gem 裡的 library
      create  exgem/lib/exgem/version.rb      <= 版本紀錄
Initializating git repo in /tmp/exgem

首先看一下 Gemfile

exgem/Gemfile :

source 'https://rubygems.org'

# Specify your gem's dependencies in exgem.gemspec
gemspec

最後一行要你定義相依套件在 exgem.gemspec

開啟 GemSpec

exgem/exgem.gemspec :

裡面的內容大部份都已填好了, 所以我們改一點使它有變化

spec.description   = %q{Description : This is my gem for example.}
spec.summary       = %q{Summary : This is my gem for example.}

撰寫你的 lib

exgem/lib/exgem.rb :

加上 hi 這個 method :

require "exgem/version"

module Exgem
  # Your code goes here...
  def self.hi
    puts "Hello, world!"
  end
end

Build

gem build exgem.gemspec
WARNING:  no homepage specified
  Successfully built RubyGem
  Name: exgem
  Version: 0.0.1
  File: exgem-0.0.1.gem

Install package

在安裝之前你都還不能 require 它, 會噴錯誤

$ irb
2.0.0-p247 :001 > require 'exgem'
LoadError: cannot load such file -- exgem
        from /Users/apple/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /Users/apple/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from (irb):1
        from /Users/apple/.rvm/rubies/ruby-2.0.0-p247/bin/irb:13:in `<main>'

所以要先安裝(需要 sudo 權限)

$ sudo gem install exgem-0.0.1.gem
Password:
Successfully installed exgem-0.0.1
1 gem installed

就可以 require 了

$ irb
2.0.0p247 :001 > require 'exgem'
 => true
2.0.0p247 :002 > Exgem.hi
Hello, world!
 => nil

發佈在 RubyGems.org

[1] 更新

gem update --system

[2] 申請一組帳號

handle 是 username 的意思

[3] 發佈到 RubyGems.org

執行

$ gem push exgem-0.0.1.gem
Pushing gem to https://rubygems.org...
Successfully registered gem: exgem (0.0.1)

官網就可以看到剛剛發佈的 gem 了 gem.JPG

gem 的相關指令

刪除

$ sudo gem uninstall exgem
Successfully uninstalled exgem-0.0.1

Troubleshootings

Error ERROR: While executing gem … (RuntimeError)

如果發生錯誤

ERROR:  While executing gem ... (RuntimeError)
    Can't find 'rubygems-update' in any repo. Check `gem source list`.

解決方法

sudo gem sources -a http://s3.amazonaws.com/production.s3.rubygems.org/
http://s3.amazonaws.com/production.s3.rubygems.org/ added to sources

Repushing of gem versions is not allowed

gem push exgem-0.0.1.gem
Pushing gem to https://rubygems.org...
Repushing of gem versions is not allowed.
Please use `gem yank` to remove bad gem releases.

修改你的 lib/exgem/version.rb, 將版本從 0.0.1 改成 0.0.2

$ gem build exgem.gemspec
WARNING:  no homepage specified
  Successfully built RubyGem
  Name: exgem
  Version: 0.0.2
  File: exgem-0.0.2.gem

會生成 exgem-0.0.2.gem, 而舊的 exgem-0.0.1.gem 不會消失

You do not have permission to push to this gem

如果發佈發生此錯誤的話表示 gem 的名稱跟別人重覆了

$ sudo gem push exgem-0.0.2.gem
Password:
Pushing gem to https://rubygems.org...
You do not have permission to push to this gem.

ref : http://blog.xdite.net/posts/2012/01/04/how-to-pack-a-gem http://weblog.rubyonrails.org/2009/9/1/gem-packaging-best-practices/ http://guides.rubygems.org/make-your-own-gem/#first-gem http://net.tutsplus.com/tutorials/ruby/gem-creation-with-bundler/ http://i3zhe.github.io/blog/2012/10/29/ru-he-zhi-zuo-zi-ji-de-gem/

引入時指定環境

都不寫代表是全部環境都會引入

gem 'bcrypt'

只引入 development, test

gem 'awesome_print', gorup: :development, :test

或
group :development, :test do
  gem "rspec"
  gem 'rspec-rails'
end

Gem error

Gem::FilePermissionError

$ gem install sitemap_generator
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/local/rvm/gems/ruby-2.2.1 directory.

使用 sudo 安裝也不行

sudo: gem: command not found

解決方法 : 切換到 sudo 加上 gem 相關的 PATH

$ $PATH
-bash: /usr/local/rvm/gems/ruby-2.2.1/bin:/usr/local/rvm/gems/ruby-2.2.1@global/bin:/usr/local/rvm/rubies/ruby-2.2.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

切換到 sudo, 在 .bashrc 最後一行加上

export PATH=$PATH:/usr/local/rvm/gems/ruby-2.2.1/bin:/usr/local/rvm/gems/ruby-2.2.1@global/bin:/usr/local/rvm/rubies/ruby-2.2.1/bin

再重新登入, 完成!

Gem::LoadError: You have already activated rake ...

Gem::LoadError: You have already activated rake 12.0.0, but your Gemfile requires rake 11.3.0.

  1. Check your Gemfile to see if rake exists. If yes, upgrade it.

  2. If no, execute bundle update rake

Useful gem

必備的 Gem

gem 'autoprefixer-rails'                    # 處理有 prefix 的 css 語法
gem 'bcrypt'                                # 加密,devise 需要
gem 'devise', '~> 3.5.2'                    # 註冊/登入 etc. 整套功能
gem 'mysql2', '~> 0.3.20'                   # MySQL
gem "paperclip", "~> 4.3"                   # 上傳
gem 'will_paginate'                         # 分頁
gem 'migration_comments'                    # 讓 migration 可以在欄位加上註解
gem 'awesome_print'                         # 讓 Rails console 顯示的資料更好閱讀
group :development, :test do
  gem "rspec"                               # Rspec
  gem 'rspec-rails'                         # Rspec
  gem 'factory_girl_rails'                  # Seed 會
  gem 'capybara'                            # 可以摸擬使用者點擊瀏覽器的行為
  gem 'faker'                               # Seed 假資料
  gem 'fabrication'                         # 不知道怎麼形容它,它像是個 Model 的模具,需要時再倒原料進去
end
group :development do
    gem 'quiet_assets'                      # 讓 log 更乾淨,過濾一些 Assets 的 log
    gem 'guard-livereload'                  # 偵測檔案變動,reload 你的瀏覽器
    gem 'better_errors'                     # 當 Error 發生時,讓頁面上顯示的錯誤更好讀
end

看情況用的 Gem

gem 'papercrop', '~> 0.3.0'                             # Crop 圖片,相依於 paperclip
gem 'rolify', '~> 4.1.1'                                # 如果需要細分權限的話
gem 'whenever', require: false                          # cronjob
gem "recaptcha", require: "recaptcha/rails"             # Google recaptcha
gem 'aws-sdk', '~> 2.2.37'                              # AWS SDK
gem 'omniauth-facebook', '~> 3.0.0'                     # FB 登入
gem "paranoia", "~> 2.1.5"                              # 軟刪除
gem 'pg'                                                # 使用 PostgreSQL 當 DB
gem 'rubocop', require: false                           # 可以利用它檢查/更正你不符合 ruby coding style 的程式碼
gem 'rails_12factor', group: :production                # Heroku : 將 rails log 導到標準輸出(STDOUT),否則會無法 Debug