Нужно ли вручную удалять все зависимые самоцветы? - PullRequest
38 голосов
/ 05 июня 2009

Я попытался удалить datamapper с помощью команды gem uninstall dm-core.

Но похоже, что целую кучу драгоценных камней также нужно удалить.

C:\>gem uninstall dm-core

You have requested to uninstall the gem:
        dm-core-0.9.11
dm-migrations-0.9.11 depends on [dm-core (= 0.9.11)]
dm-cli-0.9.11 depends on [dm-core (= 0.9.11)]
dm-serializer-0.9.11 depends on [dm-core (= 0.9.11)]
dm-timestamps-0.9.11 depends on [dm-core (= 0.9.11)]
dm-aggregates-0.9.11 depends on [dm-core (= 0.9.11)]
dm-types-0.9.11 depends on [dm-core (= 0.9.11)]
dm-is-tree-0.9.11 depends on [dm-core (= 0.9.11)]
dm-observer-0.9.11 depends on [dm-core (= 0.9.11)]
dm-validations-0.9.11 depends on [dm-core (= 0.9.11)]
If you remove this gems, one or more dependencies will not be met.
Continue with Uninstall? [Yn]  n
ERROR:  While executing gem ... (Gem::DependencyRemovalException)
    Uninstallation aborted due to dependent gem(s)

Я попытался найти документацию по "удалению gem", но, похоже, нет способа автоматически удалить зависимости:

C:\>gem help uninstall
Usage: gem uninstall GEMNAME [GEMNAME ...] [options]

  Options:
    -a, --[no-]all                   Uninstall all matching versions
    -I, --[no-]ignore-dependencies   Ignore dependency requirements while
                                     uninstalling
    -x, --[no-]executables           Uninstall applicable executables with
out
                                     confirmation
    -i, --install-dir DIR            Directory to uninstall gem from
    -n, --bindir DIR                 Directory to remove binaries from
        --[no-]user-install          Uninstall from user's home directory
                                     in addition to GEM_HOME.
    -v, --version VERSION            Specify version of gem to uninstall
        --platform PLATFORM          Specify the platform of gem to uninst
all

  Common Options:
    -h, --help                       Get help on this command
    -V, --[no-]verbose               Set the verbose level of output
    -q, --quiet                      Silence commands
        --config-file FILE           Use this config file instead of defau
lt
        --backtrace                  Show stack backtrace on errors
        --debug                      Turn on Ruby debugging


  Arguments:
    GEMNAME       name of gem to uninstall

  Summary:
    Uninstall gems from the local repository

  Defaults:
    --version '>= 0' --no-force --install-dir C:/Ruby18/lib/ruby/gems/1.8
    --user-install

C:\>

Я что-то упустил?

Ответы [ 9 ]

31 голосов
/ 21 сентября 2010

gem list | cut -d" " -f1 | xargs gem uninstall -aIx удаляет все установленные гемы рубина!

11 голосов
/ 05 июня 2009

Насколько я знаю, вы правы, в команду gem нет простого способа сделать это.

Тем не менее, вы можете проверить gem-prune, который может помочь очистить ваш репозиторий gem после удаления dm-core.

http://github.com/ddollar/gem-prune/tree/master

7 голосов
/ 18 июля 2011

Я закончил тем, что создал простой инструмент командной строки для рекурсивного извлечения зависимостей удаления .

Я также подал проблему с rubygems в gem uninstall зависимости рекурсивно .


Эта проблема с rubygems была закрыта и не будет рассматриваться, пока кто-нибудь не предоставит патч, включающий тесты.

5 голосов
/ 24 декабря 2013

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

gem list | cut -d" " -f1 | sort -R | xargs -n1 gem uninstall -aIx
5 голосов
/ 11 августа 2011
for gem in `gem list --no-version`; do
  gem uninstall -aIx $gem
done

работает лучше для меня, не знаю почему, но

gem list | cut -d" " -f1 | xargs gem uninstall -aIx

не работает в моей системе, так как все еще жалуется ...

ERROR:  While executing gem ... (Gem::InstallError)
    cannot uninstall, check `gem list -d some-gem-here`
4 голосов
/ 29 января 2016

gem cleanup должен сделать свое дело. Подробнее см. здесь .

1 голос
/ 08 июля 2009

Этот фрагмент кода делает это для меня:

def gem_deps(name)
  if `gem dependency #{name}` =~ /(Gem #{name}-.*?)(Gem|\z)/m
    $1.split("\n").grep(/runtime\s*\)/).map do |line|
      line[/[\w-]+/]
    end.compact
  else
    []
  end
end

def gem_recursive_uninstall(name)
  deps = gem_deps(name)
  if deps.empty?
    system('sudo','gem','uninstall',name)
  else
    puts("Uninstall #{name} with dependencies: #{deps.join(', ')}? [y/n]")
    if gets.chomp[/y/]
      system(*(%w{sudo gem uninstall} + [name] + deps))
    end
  end
end

Взято из http://github.com/cldwalker/irbfiles/blob/master/.irb/libraries/gem.rb

0 голосов
/ 25 января 2016

Если вы хотите использовать несколько подстановочных знаков для удаления некоторых драгоценных камней (например, чтобы удалить некоторые драгоценные камни от конкретного поставщика), то вы можете перенаправить вывод из списка драгоценных камней в grep, как показано ниже

gem list --no-version | grep "opener-" | cut -d " " -f1  | xargs gem uninstall -aIx

Приведенная выше команда удаляет все драгоценные камни, название которых начинается с "opener-"

0 голосов
/ 05 октября 2013

Просто перечислите все драгоценные камни, которые вы хотите удалить, например. gem uninstall dm-migrations dm-cli dm-observer. И старайтесь по возможности управлять своими драгоценными камнями с помощью Bundler.

...