在觀看關於RVM的文章時,其中有一部份會提到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的獨立空間,而且方便在開發時切換使用。
畫個圖,大概是長這樣
用程式碼來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
再來開始建立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......
恭喜你,成功刪除!還不會影響到其他開發環境呢!
據說在以前沒有bundler的時候,大家都會建立gemsets來做環境切換,確實是方便許多。不過在後期,bundler的出現似乎搶走了gemsets的風采,每個gem都可以憑Bundler生成,利用Gemfile、Gemfile.lock管理版本號相依關係,那Gemset還有存在的必要嗎?身為菜鳥我也不是很清楚,但沒事就拿來玩玩當練功!不喜歡再刪掉就好啦 ddd