脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

[Ruby]RVM install等でdefault で一緒にインストールされたgemをアンインストールする方法

RVM等でRubyをインストールした場合にdefaultインストールされているgemを無理やりアンインストールする方法です。

結論から言うと

RVMのgemsetに関するファイルを削除すればアンインストールできるようになります。

説明

準備

まずはdefaultのgem しかインストールされていないgemsetを作ります。
(これは説明の為に作るだけなので、実際は作らなくていいです)

$ rvm gemset list
gemsets for ruby-2.1.2 (found in /usr/local/rvm/gems/ruby-2.1.2)
=> (default)
   global

$ rvm gemset create test
ruby-2.1.2 - #gemset created /usr/local/rvm/gems/ruby-2.1.2@test
ruby-2.1.2 - #generating test wrappers..............

$ rvm gemset list
gemsets for ruby-2.1.2 (found in /usr/local/rvm/gems/ruby-2.1.2)
=> (default)
   global
   test

$ rvm gemset use test
Using ruby-2.1.2 with gemset test


$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.4)
bundler (1.7.3)
bundler-unload (1.0.2)
executable-hooks (1.3.2)
gem-wrappers (1.2.7, 1.2.5)
io-console (0.4.2)
json (1.8.1)
minitest (4.7.5)
psych (2.0.5)
rake (10.1.0)
rdoc (4.1.0)
rubygems-bundler (1.4.4)
rvm (1.11.3.9)
test-unit (2.1.2.0)  #<=====これを消したい!

今回はこのtest-unit gemをアンインストールしたいと思います。

失敗例

普通にやると、以下のようにdefaultのgemだからという理由で失敗します。

$ gem uninstall test-unit
ERROR:  While executing gem ... (Gem::InstallError)
    gem "test-unit" cannot be uninstalled because it is a default gem

updateして古いのを消そうとしても、、

$ gem update test-unit
Updating installed gems
Updating test-unit
Fetching: power_assert-0.2.3.gem (100%)
Successfully installed power_assert-0.2.3
Fetching: test-unit-3.1.2.gem (100%)
Successfully installed test-unit-3.1.2
Parsing documentation for power_assert-0.2.3
Installing ri documentation for power_assert-0.2.3
Installing darkfish documentation for power_assert-0.2.3
Parsing documentation for test-unit-3.1.2
Installing ri documentation for test-unit-3.1.2
Installing darkfish documentation for test-unit-3.1.2
Done installing documentation for power_assert, test-unit after 3 seconds
Gems updated: power_assert test-unit

$ gem list | grep test-unit
test-unit (3.1.2, 2.1.2.0)

$ gem uninstall test-unit -v '2.1.2.0'
ERROR:  While executing gem ... (Gem::InstallError)
    gem "test-unit" cannot be uninstalled because it is a default gem

$ gem cleanup test-unit
Cleaning up installed gems...
Clean Up Complete

$ gem list | grep test-unit
test-unit (3.1.2, 2.1.2.0)

消えない・・・

消す方法

RVMのインストールに関するconfigファイルを削除します

$ cd ${RVM root dir}

$ cd gems/ruby-2.1.2@global/specifications/default/ # v2.1.2の場合

$ ls -l
total 32
-rw-rw-r-- 1 root rvm  563 Oct  8  2014 bigdecimal-1.2.4.gemspec
-rw-rw-r-- 1 root rvm  357 Oct  8  2014 io-console-0.4.2.gemspec
-rw-rw-r-- 1 root rvm  584 Oct  8  2014 json-1.8.1.gemspec
-rw-rw-r-- 1 root rvm  341 Oct  8  2014 minitest-4.7.5.gemspec
-rw-rw-r-- 1 root rvm 1502 Oct  8  2014 psych-2.0.5.gemspec
-rw-rw-r-- 1 root rvm 1493 Oct  8  2014 rake-10.1.0.gemspec
-rw-rw-r-- 1 root rvm 2775 Oct  8  2014 rdoc-4.1.0.gemspec
-rw-rw-r-- 1 root rvm  511 Jul  6 15:42 test-unit-2.1.2.0.gemspec

$ mv -i test-unit-2.1.2.0.gemspec test-unit-2.1.2.0.gemspec_bk

$ gem list | test-unit

$ gem list | grep test-unit
test-unit (3.1.2)

はい消えました。

ちなみに戻すと復活します。3.1.2をインストールしていない場合は当然項目自体出てきません

$ gem list | grep tes-unit
#===> nothing

確認

本当に消せるか確認

$ gem list | grep test-unit
#===> nothing

$ gem install test-unit -v '2.1.2.0'
$ gem list | grep test-unit
test-unit (2.1.2)

$ gem uninstall test-unit
Remove executables:
        testrb

in addition to the gem? [Yn]  Y
Removing testrb
Successfully uninstalled test-unit-2.1.

$ gem list | grep test-unit
#===> nothing

以上です。