Как лучше всего удалить драгоценные камни из проекта rails3?

102

Я установил все свои драгоценные камни с помощью сборщика через Gemfile. Я подумал (ошибочно), что если я удалю гем из своего Gemfile и запустил установку пакета, то удаленные драгоценные камни будут удалены. Я просмотрел файл справки сборщика и, насколько я могу судить, в нем нет способа удалить драгоценные камни.

Я просто использую gem uninstall x для всего? Это запутает сборщика?

Lashleigh
источник

Ответы:

136

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

    gem uninstall gem_name 

как вы указали выше, поэтому каждый раз, когда вы запускаете сборщик, он будет перепроверять зависимости

РЕДАКТИРОВАТЬ - 24.12.2014

Я вижу, что люди все время задают этот вопрос. Я решил кое-что добавить. Ответ, который я дал, был для случая, когда вы поддерживаете свои драгоценные камни глобально. Рассмотрите возможность использования диспетчера драгоценных камней, такого как rbenv или rvm, чтобы сохранить набор драгоценных камней в рамках конкретных проектов.

Это означает, что никакие драгоценные камни не будут установлены на глобальном уровне, и поэтому, когда вы удалите один из Gemfile вашего проекта и повторно запустите пакет, он, очевидно, не будет загружен в ваш проект. Затем вы можете запустить пакетную чистку (с каталогом проекта), и он удалит из системы все те драгоценные камни, которые были когда-то установлены из вашего Gemfile (в том же каталоге), но в данный момент больше не перечислены там .... Короче говоря - удаляет неиспользованные драгоценные камни.

Даниэль
источник
98

Это удалит гем, установленный сборщиком:

bundle exec gem uninstall GEM_NAME

Обратите внимание, что это бросает

ОШИБКА: при выполнении gem ... (NoMethodError) неопределенный метод `delete 'для # <Bundler :: SpecSet: 0x00000101142268>

но самоцвет фактически удален. При следующем запуске bundle installгем будет переустановлен.

Phatmann
источник
10
Для пользователей RVM: вы должны использовать этот метод, если вы настроили gemset для своего конкретного проекта. Запуск gem uninstall pgиз папки проекта приведет к удалению pg из вашего гемсета глобального / системного уровня вместо сборки сборщика
Эрик Ху
Это ошибка, о которой вы говорите? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
user664833
+1 за то, что сделал это в контексте пакета. желаю, чтобы он не выдал эту ошибку! еще лучше, если бы я мог связать -f update gemname.
pduey 06
2
@EricHu нет, если вы используете гемсет RVM. всякий раз, когда вы устанавливаете гем с помощью gem install xxx внутри набора RVM, он остается там, где он остается, поэтому выполнение простого удаления gem xxx на геммете RVM удалит установленный на этом наборе гем, а не системный.
Эстебан Фельдман
@EstebanFeldman, вы правы, я думаю, что за последние 11 месяцев в RVM были внесены изменения.
Эрик Ху
21

В более новых версиях сборщика вы можете использовать задачу очистки:

$ bundle help clean
Usage:
    bundle clean

Options:
    [--dry-run=only print out changes, do not actually clean gems]
    [--force=forces clean even if --path is not set]
    [--no-color=Disable colorization in output]
    -V, [--verbose=Enable verbose output mode]

Cleans up unused gems in your bundler directory
$ bundle clean --dry-run --force
Would have removed actionmailer (3.1.12)
Would have removed actionmailer (3.2.0.rc2)
Would have removed actionpack (3.1.12)
Would have removed actionpack (3.2.0.rc2)
Would have removed activemodel (3.1.12)
...

редактировать:

Это не рекомендуется, если вы используете глобальный гемсет (т. Е. Все ваши проекты хранят свои драгоценные камни в одном месте). Однако есть несколько способов отделить жемчужины каждого проекта:

  1. rvmгемсеты ( http://rvm.io/gemsets/basics )
  2. bundle installс любым из следующих вариантов: --deploymentили --path=<path>( http://bundler.io/v1.3/man/bundle-install.1.html )
Евгения Манолова
источник
Использование bundle clean --forceудалено кучу драгоценных камней, которые я не использую в моем текущем проекте, но использую в других моих проектах. Я должен был проложить путь? Просто bundle cleanвозвращает «Можно использовать чистую сборку, только если установлен --path или --force». Но такой --pathопции даже нет в справке.
Деннис
1
Правильно, @Dennis. cleanЗадача не имеет смысла , если вы используете глобальную gemset. Но при желании каждый из ваших проектов может иметь отдельные жемчужины. Вы можете сделать это либо с помощью rvm gemsets ( rvm.io/gemsets/basics ), либо указав путь к драгоценным камням с помощью --pathопции bundle install( bundler.io/v1.3/man/bundle-install.1.html )
Евгения Манолова
1

Вы должны использовать gem uninstall gem_name, чтобы удалить драгоценный камень.

Обратите внимание, что если вы установили гем для всей системы (например, sudo bundle install), вам может потребоваться указать двоичный каталог с помощью опции -n, чтобы гарантировать удаление двоичных файлов, принадлежащих гему. Например

sudo gem uninstall gem_name  -n /usr/lib/ruby/gems/1.9.1/bin
Деклан МакГрат
источник
1

Мне казалось, что я решил эту проблему, вручную удалив драгоценный камень единорога через связку ("sudo bundler exec gem uninstall unicorn"), а затем перекомпоновав ("sudo bundle install").

Не уверен, почему это произошло, хотя вышеуказанное исправление, похоже, работает.

Аарон Маркс
источник
1

Если вы хотите очистить все свои драгоценные камни и начать заново

sudo gem clean
Дуглас Г. Аллен
источник