X'i zaten etkinleştirdiniz, ancak Gemfile'ınız Y gerektirir


128

Çalıştırırken rakeşu hatayı alıyorum:

0.9.2 rake'i zaten etkinleştirdiniz, ancak Gemfile'ınız 0.8.7 komisyon gerektirir. Bundle exec kullanmayı düşünün.

bundle exec rakeBunun yerine kullanmak rakeişe yarıyor gibi görünüyor, ancak bunu düzeltmenin en iyi yolu bu mu?


RVM'yi harika bir araç yapan da budur . Bu projelerin her biri için ayrı bir mücevher setine sahip olmanıza izin verir, böylece bunun tekrar olacağından endişelenmenize gerek kalmaz.
rm-rf

Yanıtlar:


85

Kullanımı bundle exec ise bunu yapmak için doğru yolu.

Temelde olan şey, rake'i 0.9.2'ye güncellemenizdir, bu da artık Gemfile'ınızda belirtilen sürümle çakışmaktadır. Önceden, en son sürümünüz rakeGemfile'ınızdaki sürümle eşleşiyordu, bu nedenle yalnızca kullanırken herhangi bir uyarı almadınız rake.

Yehuda Katz (orijinal Bundler geliştiricilerinden biri) her şeyi bu blog gönderisinde açıklıyor .

Sürekli yazmaktan kaçınmak bundle exec ...için, Bundler ile yaygın olarak kullandığınız komutlar için kabuğunuzda bir takma ad veya işlev ayarlayabilirsiniz. Örneğin, Rake için kullandığım şey bu:

$ type bake
bake is a function
bake () 
{ 
    bundle exec rake "$@"
}

5
Blog yazısı pek bir şey açıklamıyor. Asıl soru şudur: bakire yakut neden doğru bağımlılıkları almıyor ve o zaman neden yanlış bağımlılıklara sahip olmaktan şikayet ediyor?
Otheus

64

Tırmığın mevcut sürümünü (veya soruna neden olan başka bir cevher ne ise) korumak için bir nedeniniz varsa , matt doğrudur, bunu yapmanın en iyi yolu çalıştırmaktır bundle exec. Bu, yüklediğiniz gem'in en yeni sürümünü kullanmak yerine Gemfile'ınızda belirtilen sürümü kullanır. (rake'yi her çalıştırdığınızda yazmak istemiyorsanız nathan.f77'nin aşağıda iyi bir çözümü vardır bundle exec)

Aksi takdirde, komisyonu güncellememek için bir neden yoksa, koşabilirsiniz

bundle update rake

Bu aslında Gemfile.lock'unuzu bundle execher seferinde çalıştırmak zorunda kalmadan en yeni komisyon sürümünü kullanacak şekilde güncelleyecektir .

Not: Eğer çalıştırırsanız bundle update, bu sadece tırmık yerine Gemfile'nizdeki tüm mücevherleri güncelleyecektir, ki bu muhtemelen istediğiniz şey değildir, çünkü uygulamanızda bir şey bozulursa hangi mücevher güncellemesinin buna neden olduğunu bilemezsiniz.


Kullanmak zorunda kalmadan eski sürümü korumanın daha az önerilen yolu bundle exec, rake'in daha yeni sürümlerini kaldırmaktır.

$ gem kaldırma komisyonu

Kaldırılacak cevheri seçin:
 1. tırmık-0.8.7
 2. tırmık-0.9.2
 3. Tüm sürümler
> 2
Rake-0.9.2 başarıyla kaldırıldı

Bu işe yarar, ancak farklı tırmık sürümlerini kullanan birden çok uygulamayla çalışıyorsanız, bu bir acı olabilir çünkü kendinizi sürekli olarak farklı sürümleri yüklemek ve kaldırmak zorunda bulacaksınız.


Bu benim için çalıştı. Bazı nedenlerden dolayı, yalnızca bir sürüm (0.8.7) kuruldu. İlk önce yaptım gem install rake. Ardından gem uninstall rake0.9.2'yi seçin.
B Yedi

7
bundle updateAyrıca, sürümleri belirtilmemiş mücevherleri mevcut en son sürüme güncelleyecektir. İstediğin bu olmayabilir. bundle update rakedaha fazla ihtiyat olacaktır.
Alex Neth

Ben aynı sorun var public_suffixyerine rake. Koşu bundle update public_suffixmaalesef hiçbir etkisi olmaz.
Dmitri Zaitsev

53

Deneyin bundle clean --force

Bu pakette olmayan tüm sistem taşlarını kaldırır


13

Bu bana en son olduğunda, tüm değerli taşlarımı güncellemiştim. Bir yaptım gem uninstall rakeve sürüm seçeneklerini listeledim. Yenisini seçtim ve bundle execartık kullanmak zorunda kalmadım.

Temel olarak, eğer bundle execkullanırsanız, paketiniz tarafından yüklenmiş olan mücevher sürümünü kullanır, öyleyse Gemfile'da ne var. Bu olmadan bundle exec, sistem varsayılanınız olan sürümü kullanır.


8

Ooh! Katz makalesi harika!

Bu çözümü en çok seviyorum:

bundle install --binstubs

böylece şimdi yazabilirsin

bin/rake .stuff.

Hem 2.3 hem de 3.0.9 uygulamaları geliştiren benim gibi biri için bu beni çok daha iyi hissettiriyor.


8

bundle exec doğru, ancak her seferinde yazmak istemiyorsunuz.

Bunu .bashrc dosyanıza koyabilirsiniz:

# Automatically invoke bundler for rake, if necessary.
rake() { if [ -e ./Gemfile.lock ]; then bundle exec rake "$@"; else /usr/bin/env rake "$@"; fi; }

Açıklığa kavuşturmak gerekirse, .bashrc dosyası muhtemelen ana dizininizde [~ / .bashrc] bulunur. Bu dosya, her yeni terminal penceresi açtığınızda yüklenir.
Ryan

0

Her seferinde yazmamanın başka bir yolu da Makefile kullanmaktır, örneğin

rake :
    bundle exec rake
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.