iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 3
1

在觀看關於RVM的文章時,其中有一部份會提到Gemsets,基於菜鳥好奇心,決定來寫篇關於gemsets文章。

Gemsets

Gemsets是RVM的功能之一,它提供一個獨立的環境空間,所以不同版本的Ruby可以擁有多個gemsets,而且gemsets之間都是各自獨立互不相干的,也都可以分別安裝多個gems。

舉例說明,當你擁有多版本的Ruby時,假設目前使用的Ruby2.6.3版本,建立兩個gemset名稱分別為r523跟r600,並且在r523的gemset安裝Rails5.2.3版本,可是當你切換到gemset的r600版本時,Rails5.2.3的gemset就不存在了。所以我們可以透過Gemsets擁有分別建立兩套gem的獨立空間,而且方便在開發時切換使用。

畫個圖,大概是長這樣

https://ithelp.ithome.com.tw/upload/images/20190918/20120947HwklrrX9dD.png


用命令了解gemset

用程式碼來Run一下流程
以Ruby2.6.3版本為例,首先用gemset list來查看狀態。目前尚未建立任何gemset。

$ rvm gemset list

gemsets for ruby-2.6.3 (found in /Users/min/.rvm/gems/ruby-2.6.3)
=> (default)
   global
  • default:不指定gemset,Gem都安装在默認環境下
  • global:安裝在global中的Gem會被其他gemset繼承

再來開始建立gemset

$ rvm gemset create r523
ruby-2.6.3 - #gemset created /Users/min/.rvm/gems/ruby-2.6.3@r523
ruby-2.6.3 - #generating r523 wrappers.......

$ rvm gemset create r600
ruby-2.6.3 - #gemset created /Users/min/.rvm/gems/ruby-2.6.3@r600
ruby-2.6.3 - #generating r600 wrappers.......

此時就可以在gemset list看到我們剛建立好的r523以及r600的gemset

$ rvm gemset list

gemsets for ruby-2.6.3 (found in /Users/min/.rvm/gems/ruby-2.6.3)
=> (default) 
   global 
   r523
   r600

再來可以使用rvm use切換
假設要切換Ruby2.6.3名稱r600的gemset,命令寫成2.6.3@r600表示。

$ rvm use 2.6.3@r600
Using /Users/min/.rvm/gems/ruby-2.6.3 with gemset r600

$ rvm gemset list
gemsets for ruby-2.6.3 (found in /Users/min/.rvm/gems/ruby-2.6.3)
   (default)
   global
   r523   # 2.6.3@r523
=> r600   # 2.6.3@r600

再來,當我們安裝了Rails6.0.0版本在2.6.3@r600,可以在gem list看到Rails6.0.0版本

$ gem list

...(略過)...
 
rack (2.0.7)
rack-test (1.1.0)
rails (6.0.0)
rails-dom-testing (2.0.3)
rails-html-sanitizer (1.2.0)
railties (6.0.0)

可是當我們切換到2.6.3@r523,就看不到剛剛安裝得Rails6.0.0

$ gem list

...(略過)...
 
rake (12.3.2)
rdoc (default: 6.1.0)
rexml (default: 3.1.9)
rss (default: 0.2.7)
rubygems-bundler (1.4.5)
rvm (1.11.3.9)

當你套件安裝過多的時候,可以用以下命令重置清空gemset裡的gems

$ rvm gemset empty 2.6.3@r600

或者刪除不需要的gemset

$ rvm gemset delete r523
Are you SURE you wish to remove the entire gemset directory 'r523' (/Users/min/.rvm/gems/ruby-2.6.3@r523)?
(anything other than 'yes' will cancel) > yes
Removing gemset r523......

恭喜你,成功刪除!還不會影響到其他開發環境呢!

那什麼狀況會用到Gemsets?

據說在以前沒有bundler的時候,大家都會建立gemsets來做環境切換,確實是方便許多。不過在後期,bundler的出現似乎搶走了gemsets的風采,每個gem都可以憑Bundler生成,利用Gemfile、Gemfile.lock管理版本號相依關係,那Gemset還有存在的必要嗎?身為菜鳥我也不是很清楚,但沒事就拿來玩玩當練功!不喜歡再刪掉就好啦 ddd


上一篇
Day 02 | 環境安裝 不可少的RVM
下一篇
Day 04 | Gem與Bundler
系列文
從色彩繽紛到只看亂碼日子,學程式從 Ruby 出發!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
SunAllen
iT邦研究生 1 級 ‧ 2019-09-19 00:32:35

請問,您的作業系統是?

Aimee iT邦新手 5 級 ‧ 2019-09-20 01:24:15 檢舉

我的作業系統 macOS Mojave10.14.6

我要留言

立即登入留言