2014-01-27 2 views
33

Как удалить все драгоценные камни, установленные с помощью bundle install в конкретном проекте RoR. Я не хочу удалять драгоценные камни, которые используются другими проектами.Как удалить все драгоценные камни, установленные с помощью `bundle install`

+0

См: [? Какова наилучшим способ удаления камней из проекта rails3] (http://stackoverflow.com/questions/4667150/what-is-the-best-way-to-uninstall- gems-from-a-rails3-project) – vee

ответ

10

Нет никакого простого способа удалить все драгоценные камни - не говоря уже об удалении тех, которые находятся в определенном комплекте. Вы можете попробовать некоторые из этих предложений: Uninstall all installed gems, in OSX?

Адаптация к команде bundle show вместо gem list


На будущее, попробуйте этот подход:

Если вы установите свой пакет локально, как, например ниже, драгоценные камни не будут установлены в вашей глобальной коллекции драгоценных камней. Затем вы можете легко удалить папку установки, чтобы удалить все драгоценные камни пакета.

# install gems to project_root/vendor/bundle 
bundle install --path vendor/bundle --without test 

Опция путь сохраняется в .bundle/конфигурации так же, как и все другие, и любые последующие bundle install звонки будут использовать его, если вы установите его на что-то другое или удалить его из конфигурации!

+1

+1 Я всегда устанавливаю их у поставщика. Легче управлять и поддерживать систему в чистоте. – andHapp

+0

@KappaNossi: Если я удалю папку. Разве это освободит память, занятую драгоценными камнями, установленными в соответствующем комплекте? – nish

+0

Да, конечно. Недостатком является то, что если в нескольких проектах используется один и тот же камень, у вас будет несколько его установок в соответствующих папках поставщиков, вместо того, чтобы использовать один центральный драгоценный камень в глобальном списке драгоценных камней. – KappaNossi

23

Так как мы используем рубин вы могли бы сделать что-то вроде этого, я предполагаю:

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(/\(|\)/, "")}`; }' 

ПРИМЕЧАНИЕ: Только слегка испытания.

+0

Пробовал это, и не работает. Мой намек заключается в том, что вывод списка пакетов не является чистым списком конкретных драгоценных камней: драгоценные камни в списке пакетов не включают версию, есть пулевые точки и другая строка заголовка, которая может мешать. Мои два цента. – j4v1

+0

Работал для меня после удаления '--force' – Gerry

+0

для меня на OSX работал выше, вместо замены' list' в первой команде с помощью 'show'. - Подождите - я не совсем уверен, удалил ли он только драгоценные камни из этого конкретного Gemfile. Это выглядит так: http://bundler.io/v1.11/bundle_show.html – MikeiLL

1

Если вы используете RVM, вы, конечно, можете просто удалить и переустановить версию рубина, под которым вы установили драгоценные камни, т.е.

% 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/[email protected] 
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........ 

и теперь у вас есть рубиновая среда чистой любые установленные драгоценные камни.

6

Вы можете использовать (как говорит Тобиас, если вы используете RVM)

rvm gemset empty [gemset]

Непосредственно на gemset, например

rvm gemset empty [email protected] 
+0

Это работает, только если он использует RVM. – Tobias

0

Найдено решение для удаления всех драгоценных камней, кроме дефолта :

Crete 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/

1

Это на самом деле так просто, как

gem list --no-versions | xargs gem uninstall -a 

Если вы не используете RVM/RBENV, вы можете попасть в вопрос, когда камень пытается удалить системную библиотеку, которая может потерпеть неудачу. В этом случае вызовите команду uninstall один за другим, чтобы пропустить их.

gem list --no-versions | xargs -n1 gem uninstall -a 
Смежные вопросы