特定のRoRプロジェクトでbundle install
を使用してインストールされたすべてのgemを削除するにはどうすればよいですか。他のプロジェクトで使用されているgemをアンインストールしたくない。
Rubyを使用しているので、次のようなことができます。
bundle list | Ruby -e 'ARGF.readlines[1..-1].each {|l| g = l.split(" "); puts "Removing #{g[1]}"; `gem uninstall --force #{g[1]} -v #{g[2].gsub(/\(|\)/, "")}`; }'
注:軽くテストしただけです。
すべての宝石を削除する簡単な方法はありません-特定のバンドル内の宝石を削除することは言うまでもありません。これらの提案のいくつかを試すことができます: OSXでインストールされているすべてのgemをアンインストールしますか?
bundle show
の代わりにgem list
コマンドに適応する
将来的には、このアプローチを試してください。
次の例のようにバンドルをローカルにインストールする場合、gemsはグローバルgemディレクトリにインストールされません。その後、インストールフォルダを簡単に削除して、バンドルのすべてのgemを削除できます。
# install gems to project_root/vendor/bundle
bundle install --path vendor/bundle --without test
パスオプションは、他のすべてと同じように.bundle/configに保存され、他の何かに設定するか、構成から削除しない限り、後続のbundle install
呼び出しはそれを使用します!
使用できます(RVMを使用している場合、Tobiasが言うように)
rvm gemset empty [gemset]
たとえば、gemsetで直接
rvm gemset empty 2.0.0@server
実際には次のように簡単です
gem list --no-versions | xargs gem uninstall -a
RVM/RBENVを使用していない場合、gemがシステムライブラリをアンインストールしようとしたときに問題が発生する可能性があり、失敗する可能性があります。その場合は、アンインストールコマンドを1つずつ呼び出してこれらをスキップします。
gem list --no-versions | xargs -n1 gem uninstall -a
https://makandracards.com/jan0sch/9537-uninstall-all-Ruby-gems-from-your-system からの別の方法( rainkinz's answer および- ラルフのコメント )。いくつかのバリエーションがあります。
# if you're the root user:
gem list | cut -d" " -f1 | xargs -I % gem uninstall -aIx %
# if you're a non-root user:
gem list | cut -d" " -f1 | xargs -I % Sudo gem uninstall -aIx %
# docker compose (if your service is named "web" running the root user):
docker-compose run web bash -c 'gem list | cut -d" " -f1 | xargs -I % gem uninstall -aIx %'
####
gem install bundler
# or if using docker compose:
docker-compose run web gem install bundler
# optionally reinstall gems:
bundle install
# or if using docker compose:
docker-compose run web bundle install
これを分解する:
gem list
はすべてのgemをリストしますcut -d" " -f1
は最初の列を取りますxargs -I % gem uninstall -aIx %
は、各出力行を引数としてgem uninstall -aIx
を呼び出します-I
で引数を%
として指定し、セキュリティのために直接渡したことに注意してください。
xargs -I % gem uninstall -aIx %
の代わりに:
xargs gem uninstall -aIx
xargs
には、-n
などのオプションをコマンドに渡して予期しない結果を引き起こす可能性があるというセキュリティ上の問題があるためです。これは、次の例で示すことができます。
# correctly prints "-n hello" (with trailing newline):
echo '-n Hello' | xargs -I % echo % | xargs -I % echo %
# incorrectly prints "hello" (without trailing newline):
echo '-n Hello' | xargs echo
Rvmを使用している場合は、もちろん、gemsをインストールしたRubyのバージョンをアンインストールして再インストールすることもできます。
% rvm use
Using /home/ubuntu/.rvm/gems/Ruby-2.2.1
% rvm uninstall 2.2.1
Ruby-2.2.1 - #removing rubies/Ruby-2.2.1..
Ruby-2.2.1 - #removing default Ruby interpreter.............
% rvm install 2.2.1
Searching for binary rubies, this might take some time.
Found remote file https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.0/x86_64/Ruby-2.2.1.tar.bz2
Checking requirements for ubuntu.
Requirements installation successful.
Ruby-2.2.1 - #configure
Ruby-2.2.1 - #download
Ruby-2.2.1 - #validate archive
Ruby-2.2.1 - #setup
Ruby-2.2.1 - #gemset created /home/ubuntu/.rvm/gems/Ruby-2.2.1@global
Ruby-2.2.1 - #importing gemset /home/ubuntu/.rvm/gemsets/global.gems..............................
Ruby-2.2.1 - #generating global wrappers........
Ruby-2.2.1 - #gemset created /home/ubuntu/.rvm/gems/Ruby-2.2.1
Ruby-2.2.1 - #importing gemsetfile /home/ubuntu/.rvm/gemsets/default.gems evaluated to empty gem list
Ruby-2.2.1 - #generating default wrappers........
そして今、あなたはRubyインストールされた宝石のきれいな環境を持っています。
デフォルト以外のすべてのgemをアンインストールするためのソリューションが見つかりました:
クレタdelete_gems.rbで
#!/usr/bin/env Ruby
# Remove all gems EXCEPT defaults :)
`gem list -d`.split(/\n\n^(?=\w)/).each do |data|
match = data.match(/(?<name>([^\s]+)) \((?<versions>.*)\)/)
name = match[:name]
versions = match[:versions].split(', ')
if match = data.match(/^.*\(([\d\.]*),? ?default\): .*$/)
next if match[1].empty? # it's the only version if this match is empty
versions.delete(match[1] || versions[0])
end
versions.each { |v| system "gem uninstall -Ix #{name} -v #{v}" }
end
このスクリプトを実行します:
Sudo chmod 1777 delete_gems.rb
./delete_gems.rb
デフォルトを除き、すべての宝石が削除されます。ここに元のソリューションのリンク http://zanshin.net/2013/06/10/how-to-delete-all-Ruby-gems/
あなたの問題が私のものに似ている場合、GemFile
の変更のテスト中にインストールされたすべてのgemをアンインストールする必要があります。
bundle clean
GemFile
およびGemFile.lock
で指定されていないすべてのgemをアンインストールしました。
テストしていませんが、Gemfileからすべての行を削除し、上記のコマンドを実行して、RORプロジェクトによって現在のディレクトリにインストールされたすべてのgemを削除できると思います。