Apa cara terbaik untuk menghapus permata dari proyek rails3?

102

Saya menginstal semua permata saya menggunakan bundler melalui Gemfile. Saya berpikir (secara keliru) bahwa jika saya menghapus permata dari Gemfile saya dan menjalankan 'bundle install', permata yang dihapus itu akan dihapus. Saya telah melihat file bantuan bundler dan, sejauh yang saya tahu, tidak ada cara untuk menghapus permata.

Apakah saya hanya menggunakan gem uninstall x untuk semuanya? Apakah ini akan membingungkan bundler?

lashleigh
sumber

Jawaban:

136

Bundler diluncurkan dari direktori root aplikasi Anda sehingga memastikan semua permata yang dibutuhkan hadir agar aplikasi Anda berfungsi.Jika karena alasan tertentu Anda tidak lagi membutuhkan permata, Anda harus menjalankan

    gem uninstall gem_name 

Seperti yang Anda sebutkan di atas. Jadi setiap kali Anda menjalankan bundler, itu akan memeriksa ulang dependensi

EDIT - 24.12.2014

Saya melihat bahwa orang-orang terus datang ke pertanyaan ini, saya memutuskan untuk menambahkan sedikit. Jawaban yang saya berikan adalah untuk kasus ketika Anda mempertahankan permata Anda secara global. Pertimbangkan untuk menggunakan pengelola permata seperti rbenv atau rvm untuk menjaga kumpulan permata dalam cakupan proyek tertentu.

Ini berarti bahwa tidak ada permata yang akan dipasang pada tingkat global dan oleh karena itu ketika Anda menghapus satu dari Gemfile proyek Anda dan menjalankan kembali bundel, maka itu, jelas, tidak akan dimuat dalam proyek Anda. Kemudian, Anda dapat menjalankan bundle clean (dengan direktori proyek) dan itu akan menghapus semua permata yang pernah diinstal dari Gemfile Anda (di direktori yang sama) tetapi saat ini tidak lagi terdaftar di sana .... Singkat cerita - ini menghapus permata yang tidak digunakan.

Daniel
sumber
98

Ini akan menghapus permata yang dipasang oleh bundler:

bundle exec gem uninstall GEM_NAME

Perhatikan bahwa lemparan ini

GALAT: Saat menjalankan permata ... (NoMethodError) metode tidak ditentukan `hapus 'untuk # <Bundler :: SpecSet: 0x00000101142268>

tapi permata itu benar-benar dihapus. Lain kali Anda menjalankan bundle installpermata akan dipasang ulang.

phatmann.dll
sumber
10
Untuk pengguna RVM: Anda harus menggunakan metode ini jika Anda telah menyiapkan gemet untuk proyek khusus Anda. Menjalankan gem uninstall pgdari folder proyek akan menghapus pg dari gemet tingkat global / sistem Anda alih-alih milik bundler
Eric Hu
Apakah ini kesalahan yang Anda maksud? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
pengguna664833
1 untuk melakukannya dalam konteks bundel. berharap itu tidak membuang kesalahan itu! Lebih baik lagi, semoga saya bisa membundel -f memperbarui nama permata.
pduey
2
@EricHu tidak jika Anda menggunakan permata RVM. setiap kali Anda menginstal permata dengan permata menginstal xxx di dalam permata itu RVM, di sanalah ia tetap, jadi melakukan uninstall permata biasa xxx pada permatair RVM akan menghapus permata yang diinstal pada permata itu dan bukan yang sistem.
Esteban Feldman
@EstebanFeldman Anda benar, saya pikir ini adalah perubahan yang dilakukan pada RVM dalam 11 bulan terakhir.
Eric Hu
21

Dengan versi bundler yang lebih baru, Anda dapat menggunakan tugas bersih:

$ 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)
...

edit:

Ini tidak disarankan jika Anda menggunakan gemet global (yaitu - semua proyek Anda menyimpan permata mereka di tempat yang sama). Ada beberapa cara untuk memisahkan permata setiap proyek:

  1. rvmgemsets ( http://rvm.io/gemsets/basics )
  2. bundle installdengan salah satu opsi berikut: --deploymentatau --path=<path>( http://bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova
sumber
Menggunakan bundle clean --forcemenghapus banyak permata yang tidak saya gunakan dalam proyek saya saat ini tetapi digunakan dalam proyek saya yang lain. Apakah saya seharusnya menetapkan jalan? Hanya bundle cleanmengembalikan "Hanya dapat menggunakan bundle clean saat --path disetel atau --force disetel". Tetapi --pathopsi tersebut bahkan tidak muncul di bantuan.
Dennis
1
Itu benar @Dennis. The cleantugas tidak benar-benar masuk akal jika Anda menggunakan gemset global. Tetapi jika Anda mau, setiap proyek Anda dapat memiliki permata yang terpisah. Anda dapat melakukannya melalui rvm gemsets ( rvm.io/gemsets/basics ), atau dengan menentukan jalur permata melalui --pathopsi bundle install( bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova
1

Anda harus menggunakan 'gem uninstall gem_name' untuk menghapus permata.

Perhatikan bahwa jika Anda menginstal gem system-wide (mis. Sudo bundle install) maka Anda mungkin perlu menentukan direktori biner menggunakan opsi -n, untuk memastikan binari milik gem telah dihapus. Sebagai contoh

sudo gem uninstall gem_name  -n /usr/lib/ruby/gems/1.9.1/bin
Declan McGrath
sumber
1

Sepertinya saya menyelesaikan ini dengan menghapus permata unicorn secara manual melalui bundler ("sudo bundler exec gem uninstall unicorn"), lalu melakukan rebundling ("sudo bundle install").

Tidak yakin mengapa itu terjadi, meskipun perbaikan di atas tampaknya berhasil.

Aaron Marks
sumber
1

Jika Anda ingin membersihkan semua permata Anda dan memulai kembali

sudo gem clean
Douglas G. Allen
sumber