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
gem -v
: RubyGems 版本
gem update --system
: 升級 RubyGems
gem install gem_name
: 安裝某個套件, 加上 --no-ri --no-rdoc
不產生文件
gem list
: 列出安裝的套件
gem update gem_name
: 更新最新版本
gem update
: 更新所有 Gem
gem install -v x.x.x gemname
: 安裝特定版本
gem uninstall gem_name
: 反安裝
Gemfile 版本符號代表意義
gem 'rails', '4.2.6'
- 不指定 : 使用最新版
4.2.6
: 明確指定使用 4.2.6
版
~> 1
: 1.0 ~ 1.9 (小於 2.0)
~> 2.1
: 2.1 ~ 2.9 (小於 3.0)
~> 2.0.3
: 2.0.3 ~ 2.0.9 (小於 2.1)
~> 2.2.beta
: will match 2.2.beta.12
>= 3.2
: 3.2 以上的版本
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
- 出現提示
WARNING: no homepage specified
可以忽略它,
- 因為在 exgem.gemspec 裡我們沒有定義
spec.homepage
, 它是一個 URI
- 目錄底下會多出此檔
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
- 像我習慣用 tmux 分頁切來切去, 如果一 TAB 執行
gem install exgem-0.0.1.gem
, 另一 TAB 執行 irb
可能會造成 require exgem
失敗
- 最好是
irb
離開再重進一次, 才抓得到新的 gem package
發佈在 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 的相關指令
刪除
$ 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.
-
Check your Gemfile to see if rake
exists. If yes, upgrade it.
-
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