Bir rails3 projesinden mücevherleri kaldırmanın en iyi yolu nedir?


102

Tüm değerli taşlarımı paketleyici kullanarak Gemfile aracılığıyla yükledim. Gemfile'ımdan bir mücevheri silip 'paket yüklemeyi' çalıştırırsam, silinen mücevherlerin kaldırılacağını düşündüm (yanlışlıkla). Paketleyicinin yardım dosyasına baktım ve anlayabildiğim kadarıyla mücevherleri kaldırmanın bir yolu yok.

Her şey için sadece gem uninstall x mi kullanıyorum? Bu, Bundler'ın kafasını karıştıracak mı?

Yanıtlar:


136

Bundler, uygulamanızın kök dizininden başlatılır, böylece uygulamanızın çalışması için gerekli tüm mücevherlerin mevcut olduğundan emin olur.

    gem uninstall gem_name 

Yukarıda belirttiğiniz gibi, paketleyiciyi her çalıştırdığınızda bağımlılıkları yeniden kontrol edecektir.

DÜZENLEME - 24.12.2014

İnsanların bu soruya gelmeye devam ettiğini görüyorum, bir şeyler eklemeye karar verdim. Verdiğim cevap, değerli taşlarınızı global olarak tuttuğunuz durum içindi. Değerli taş setlerini belirli projelere uygun şekilde tutmak için rbenv veya rvm gibi bir mücevher yöneticisi kullanmayı düşünün.

Bu, küresel düzeyde hiçbir mücevherin yüklenmeyeceği anlamına gelir ve bu nedenle, projenizin Gemfile'ından birini çıkardığınızda ve paketi yeniden çalıştırdığınızda, açıkça projenize yüklenmeyecektir. Ardından, bundle clean'i çalıştırabilirsiniz (proje diziniyle) ve bir zamanlar Gemfile'ınızdan (aynı dizinde) yüklenen tüm mücevherleri sistemden kaldırır, ancak şu anda artık orada listelenmez .... uzun lafın kısası - kullanılmayan taşları kaldırır.


98

Bu, paketleyici tarafından yüklenen bir mücevheri kaldırır:

bundle exec gem uninstall GEM_NAME

Bunun attığını unutmayın

HATA: gem ... (NoMethodError) yürütülürken # <Bundler :: SpecSet: 0x00000101142268> için tanımsız `` delete '' yöntemi

ama mücevher aslında kaldırıldı. Bir dahaki sefere çalıştırdığınızda bundle installmücevher yeniden yüklenecek.


10
RVM kullanıcıları için: Belirli bir projeniz için bir mücevher seti kurduysanız, bu yöntemi kullanmanız gerekir. Koşu gem uninstall pgyerine bundler en hakkındaki global / sistem seviyesi gemset gelen pg kaldıracaksınız proje klasörden
Eric Hu

Bahsettiğiniz hata bu mu? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
user664833

Bunu paket bağlamında yapmak için +1. keşke o hatayı atmasaydı! daha iyisi, keşke gemname güncellemesini paketleyebilseydim.
pduey

2
RVM mücevher setini kullanıyorsanız @EricHu değil. Bir RVM mücevher setinin içine gem install xxx ile bir mücevher kurduğunuzda, orada kaldığı yer orasıdır, bu nedenle, bir RVM mücevher setinde düz bir mücevher kaldırma xxx yapmak, sistem setini değil, o mücevher setinde yüklü olan mücevheri kaldıracaktır.
Esteban Feldman

@EstebanFeldman haklısınız, bunun son 11 ayda RVM'de yapılan bir değişiklik olduğunu düşünüyorum.
Eric Hu

21

Paketleyicinin daha yeni sürümlerinde temiz görevi kullanabilirsiniz:

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

Düzenle:

Küresel bir mücevher seti kullanıyorsanız bu önerilmez (yani, tüm projeleriniz mücevherlerini aynı yerde tutar). Yine de, her projenin cevherlerini ayrı tutmanın birkaç yolu vardır:

  1. rvmgemsets ( http://rvm.io/gemsets/basics )
  2. bundle installaşağıdaki seçeneklerden herhangi biriyle: --deploymentveya --path=<path>( http://bundler.io/v1.3/man/bundle-install.1.html )

Kullanma bundle clean --forcebenim projede kullanmak ama benim diğer projelerde kullanılmasını yapmayın taşlar bir demet kaldırıldı. Bir yol belirlemem mi gerekiyordu? Yalnızca bundle clean, "Yalnızca --path ayarlandığında veya --force ayarlandığında bundle clean kullanılabilir" döndürür. Ancak --pathseçenek yardımda bile görünmüyor.
Dennis

1
Doğru @Dennis. cleanİster küresel gemset kullanıyorsanız görev gerçekten mantıklı değil. Ancak isterseniz, projelerinizin her birinin ayrı ayrı mücevherleri olabilir. Bunu, rvm gemsets ( rvm.io/gemsets/basics ) aracılığıyla veya ( bundler.io/v1.3/man/bundle-install.1.html )--pathbundle install
Evgenia

1

Bir gem'i kaldırmak için 'gem uninstall gem_name' kullanmalısınız.

Gem'i sistem genelinde yüklediyseniz (yani, sudo bundle install), gem'e ait ikili dosyaların kaldırıldığından emin olmak için ikili dizini -n seçeneğini kullanarak belirtmeniz gerekebilir. Örneğin

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

1

Bunu, tek boynuzlu at gemini paketleyici ("sudo bundler exec gem uninstall unicorn") ve ardından yeniden sunma ("sudo bundle install") aracılığıyla manuel olarak kaldırarak çözmüş gibiydim.

Yukarıdaki düzeltme işe yarıyor gibi görünse de, neden olduğundan emin değilim.



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.