Який найкращий спосіб видалити дорогоцінні камені з проекту rails3?


102

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

Чи просто я використовую gem uninstall x для всього? Це збирається заплутати постачальника?

Відповіді:


136

Пакет Bundler запускається з кореневого каталогу вашого додатка, тому він гарантує наявність усіх потрібних дорогоцінних каменів, щоб ваш додаток працював. Якщо чомусь вам більше не потрібен дорогоцінний камінь, вам доведеться запустити

    gem uninstall gem_name 

як ви сказали вище. Отже, кожен раз, коли ви запускаєте постачальник, він перегляне залежність

РЕДАКЦІЯ - 24.12.2014

Я бачу, що люди продовжують підходити до цього питання, я вирішив трохи додати. Я відповів на те, що ви підтримуєте свої дорогоцінні камені глобальними. Подумайте про використання диспетчера дорогоцінних каменів, таких як rbenv або rvm для збереження наборів дорогоцінних каменів, що підпадають під конкретні проекти.

Це означає, що жодні дорогоцінні камені не будуть встановлені на глобальному рівні, і тому, коли ви виймете один із Gemfile вашого проекту та перезапустите пакет, він, очевидно, не буде завантажений у ваш проект. Потім ви можете запустити пакет чистих (з проектом dir), і він видалить із системи всі ті дорогоцінні камені, які колись були встановлені з вашого Gemfile (у тому ж режимі), але в даний момент часу вже не перераховані там .... довга історія коротко - вона видаляє невикористані дорогоцінні камені.


98

Це видалить дорогоцінний камінь, встановлений bundler:

bundle exec gem uninstall GEM_NAME

Зауважте, що це кидає

ПОМИЛКА: Під час виконання gem ... (NoMethodError) невизначений метод `delete 'для # <Bundler :: SpecSet: 0x00000101142268>

але дорогоцінний камінь фактично видалений. Наступного разу, коли запустити bundle installдорогоцінний камінь, буде встановлено знову.


10
Для користувачів RVM: ви повинні використовувати цей метод, якщо ви створили дорогоцінний набір для свого конкретного проекту. Запуск gem uninstall pgіз папки проекту видалить pg з вашого глобального / системного гемсета замість постачальника
Ерік Ху

Це помилка, на яку ви посилаєтесь? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
user664833

+1 для цього в контексті пакету. хотілося б, щоб це не помилка! ще краще, бажаю, щоб я міг зв’язати -f оновити gemname.
pduey

2
@EricHu ні, якщо ви використовуєте GVset RVM. щоразу, коли ви встановлюєте дорогоцінний камінь із встановленим каменем, встановіть xxx всередині дорогоцінного набору RVM, там він залишається, тож звичайний дорогоцінний камінь видалить xxx на дорогоцінному наборі RVM видалить дорогоцінний камінь, встановлений на цьому гемсеті, а не системному.
Естебан Фельдман

@EstebanFeldman Ви маєте рацію, я думаю, що це було зміною, внесеною до RVM за останні 11 місяців.
Ерік Ху

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. rvmgemsets ( 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завдання насправді не має сенсу, якщо ви використовуєте глобальний дорогоцінний набір. Але якщо ви хочете, кожен ваш проект може мати окремі дорогоцінні камені. Це можна зробити або через rvm gemsets ( rvm.io/gemsets/basics ), або вказавши шлях дорогоцінних каменів через --pathопцію bundle install( bundler.io/v1.3/man/bundle-install.1.html )
Євгенія Манолова

1

Ви повинні використовувати "gem uninstall gem_name", щоб видалити дорогоцінний камінь.

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

sudo gem uninstall gem_name  -n /usr/lib/ruby/gems/1.9.1/bin

1

Я, здавалося, вирішив це, вручну видаливши дорогоцінний камінь єдинорога через bundler ("sudo bundler exec gem uninstall unicorn"), а потім перекомпонувавши ("встановити пакет sudo").

Не впевнений, чому це сталося, хоча вищезгадане виправлення, здається, працює.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.