Anda telah mengaktifkan X, tetapi Gemfile Anda membutuhkan Y

128

Saat menjalankan rakesaya mendapatkan kesalahan ini:

Anda telah mengaktifkan rake 0.9.2, tetapi Gemfile Anda membutuhkan rake 0.8.7. Pertimbangkan untuk menggunakan bundle exec.

Menggunakan bundle exec rakealih-alih rakesepertinya berfungsi, tetapi apakah ini cara terbaik untuk memperbaikinya?

ming kamu
sumber
Ini juga yang membuat RVM alat yang hebat. Ini akan memungkinkan Anda untuk memiliki satu set permata terpisah untuk masing-masing proyek ini sehingga Anda tidak perlu khawatir tentang ini terjadi lagi.
rm-rf

Jawaban:

84

Menggunakan bundle exec adalah cara yang tepat untuk melakukan ini.

Pada dasarnya yang terjadi adalah Anda memperbarui rake ke 0.9.2 yang sekarang bertentangan dengan versi yang ditentukan di Gemfile Anda. Sebelumnya versi terbaru rakeAnda telah cocok dengan versi di Gemfile Anda, jadi Anda tidak mendapatkan peringatan apa pun saat menggunakan rake.

Yehuda Katz (salah satu pengembang Bundler asli) menjelaskan semuanya dalam posting blog ini .

Untuk menghindari mengetik bundle exec ...sepanjang waktu, Anda bisa mengatur alias atau fungsi di shell Anda untuk perintah yang biasa Anda gunakan dengan Bundler. Sebagai contoh, inilah yang saya gunakan untuk Rake:

$ type bake
bake is a function
bake () 
{ 
    bundle exec rake "$@"
}
matt
sumber
5
Posting blog tidak terlalu menjelaskan banyak hal. Pertanyaan sebenarnya adalah: mengapa virgin ruby ​​tidak mendapatkan dependensi yang tepat dan mengapa kemudian mengeluh memiliki yang salah?
Otheus
64

Jika Anda memiliki alasan untuk mempertahankan versi rake saat ini (atau permata apa pun yang menyebabkan masalah), matt sudah benar, cara terbaik untuk melakukannya adalah dengan menjalankannya bundle exec. Ini menggunakan versi yang ditentukan dalam Gemfile Anda alih-alih menggunakan versi terbaru permata yang telah Anda instal. (nathan.f77 memiliki solusi yang bagus di bawah ini jika Anda tidak ingin mengetik bundle execsetiap kali menjalankan rake)

Jika tidak, jika tidak ada alasan untuk tidak memperbarui rake, Anda dapat menjalankannya

bundle update rake

Ini sebenarnya akan memperbarui Gemfile Anda. Kunci untuk menggunakan rake versi terbaru daripada harus berjalan bundle execsetiap waktu.

Catatan: jika Anda menjalankan bundle updateini saja akan memperbarui semua permata di Gemfile Anda alih-alih hanya rake, yang mungkin bukan yang Anda inginkan, karena jika sesuatu rusak dalam aplikasi Anda, Anda tidak akan tahu pembaruan permata mana yang menyebabkannya.


Cara yang kurang disarankan untuk mempertahankan versi yang lebih lama tanpa harus menggunakan bundle execadalah menghapus instalasi versi rake yang lebih baru.

uninstall $ gem rake

Pilih permata untuk dihapus:
 1. rake-0.8.7
 2. rake-0.9.2
 3. Semua versi
> 2
Berhasil menghapus rake-0.9.2

Ini berfungsi, tetapi jika Anda bekerja dengan beberapa aplikasi yang menggunakan versi rake yang berbeda, ini bisa menyebalkan karena Anda akan terus-menerus harus menginstal dan mencopot versi yang berbeda.

Ryan
sumber
Ini berhasil untuk saya. Untuk beberapa alasan, hanya ada satu versi (0.8.7) yang diinstal. Jadi pertama saya lakukan gem install rake. Kemudian gem uninstall rakedan pilih 0.9.2.
B Tujuh
7
bundle updatejuga akan memperbarui permata apa pun tanpa versi yang ditentukan untuk versi terbaru yang tersedia. Itu mungkin bukan yang Anda inginkan. bundle update rakeakan lebih banyak precies.
Alex Neth
Saya memiliki masalah yang sama dengan public_suffixbukan rake. Menjalankan bundle update public_suffixtidak memiliki efek, sayangnya.
Dmitri Zaitsev
53

Mencoba bundle clean --force

Ini menghapus setiap permata sistem yang tidak ada dalam bundel ini

Oleg Dikusar
sumber
13

Terakhir kali ini terjadi pada saya, saya telah memperbarui semua permata saya. Saya melakukan gem uninstall rakedan terdaftar opsi versi. Saya memilih yang baru, dan kemudian saya tidak perlu menggunakan bundle execlagi.

Pada dasarnya, jika Anda menggunakannya bundle execmenggunakan versi permata apa pun yang diinstal oleh bundel Anda, jadi apa yang ada di Gemfile. Tanpa bundle execitu menggunakan versi apa pun adalah default sistem Anda.

paarshad
sumber
8

Ooh! Artikel Katz sangat bagus!

Saya suka solusi ini yang terbaik:

bundle install --binstubs

sehingga sekarang Anda bisa mengetik

bin/rake .stuff.

Untuk orang seperti saya yang sedang mengembangkan aplikasi 2.3 dan 3.0.9, ini membuat saya merasa jauh lebih baik.

nessur
sumber
8

bundle exec benar, tetapi Anda tidak ingin mengetik setiap waktu.

Anda bisa meletakkan ini di .bashrc Anda:

# Automatically invoke bundler for rake, if necessary.
rake() { if [ -e ./Gemfile.lock ]; then bundle exec rake "$@"; else /usr/bin/env rake "$@"; fi; }
ndbroadbent
sumber
Untuk memperjelas, file .bashrc mungkin terletak di direktori home Anda [~ / .bashrc]. File ini dimuat setiap kali Anda membuka jendela terminal baru.
Ryan
0

Cara lain untuk tidak mengetiknya setiap waktu adalah dengan Makefile, misalnya

rake :
    bundle exec rake
qwr
sumber