คุณเปิดใช้งาน X แล้ว แต่ Gemfile ของคุณต้องการ Y


128

เมื่อเรียกใช้rakeฉันได้รับข้อผิดพลาดนี้:

คุณได้เปิดใช้งานคราด 0.9.2 แล้ว แต่ Gemfile ของคุณต้องการคราด 0.8.7 พิจารณาใช้ Bundle exec

การใช้bundle exec rakeแทนที่จะrakeดูเหมือนจะใช้งานได้ แต่เป็นวิธีที่ดีที่สุดในการแก้ไขปัญหานี้หรือไม่?


นี่คือสิ่งที่ทำให้RVMเป็นเครื่องมือที่ยอดเยี่ยม จะช่วยให้คุณมีชุดอัญมณีแยกกันสำหรับแต่ละโครงการดังนั้นคุณจะไม่ต้องกังวลกับเหตุการณ์นี้อีก
rm-rf

คำตอบ:


85

การใช้bundle exec เป็นวิธีที่ถูกต้องในการทำเช่นนี้

โดยทั่วไปสิ่งที่เกิดขึ้นคือคุณได้อัปเดตคราดเป็น 0.9.2 ซึ่งตอนนี้ขัดแย้งกับเวอร์ชันที่ระบุใน Gemfile ของคุณ ก่อนหน้านี้รุ่นล่าสุดของrakeคุณได้จับคู่กับรุ่นใน Gemfile ของคุณเพื่อให้คุณไม่ได้รับการแจ้งเตือนใด ๆ rakeเมื่อเพียงแค่ใช้

Yehuda Katz (หนึ่งในผู้พัฒนา Bundler ดั้งเดิม) อธิบายทั้งหมดในบล็อกโพสต์นี้

เพื่อหลีกเลี่ยงการพิมพ์bundle exec ...ตลอดเวลาคุณสามารถตั้งค่านามแฝงหรือฟังก์ชันในเชลล์ของคุณสำหรับคำสั่งที่คุณมักใช้กับ Bundler ตัวอย่างเช่นนี่คือสิ่งที่ฉันใช้สำหรับ Rake:

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

5
โพสต์บล็อกไม่ได้อธิบายอะไรมาก คำถามที่แท้จริงคือทำไมทับทิมบริสุทธิ์ไม่ได้รับการอ้างอิงที่ถูกต้องแล้วทำไมจึงบ่นว่ามีคนผิด?
Otheus

64

หากคุณมีเหตุผลที่จะให้รุ่นปัจจุบันของคราด (หรืออะไรก็ตามอัญมณีอื่น ๆ ที่เป็นสาเหตุของปัญหา), แมตต์bundle execถูกต้องวิธีที่ดีที่สุดที่จะทำนี้คือการวิ่ง สิ่งนี้ใช้เวอร์ชันที่ระบุใน Gemfile ของคุณแทนที่จะใช้อัญมณีเวอร์ชันใหม่ล่าสุดที่คุณติดตั้ง (nathan.f77 มีทางออกที่ดีด้านล่างหากคุณไม่ต้องการพิมพ์bundle execทุกครั้งที่คุณเรียกใช้คราด)

มิฉะนั้นหากไม่มีเหตุผลที่จะไม่อัปเดตคราดคุณสามารถเรียกใช้

bundle update rake

สิ่งนี้จะอัปเดต Gemfile.lock ของคุณให้ใช้คราดเวอร์ชันใหม่ล่าสุดแทนที่จะต้องเรียกใช้bundle execทุกครั้ง

หมายเหตุ:หากคุณเรียกใช้เพียงแค่bundle updateนี้จะเป็นการอัปเดตอัญมณีทั้งหมดใน Gemfile ของคุณแทนที่จะเป็นเพียงการคราดซึ่งอาจไม่ใช่สิ่งที่คุณต้องการเพราะหากมีบางอย่างแตกในแอปพลิเคชันของคุณคุณจะไม่รู้ว่าการอัปเดตอัญมณีใดทำให้เกิด


วิธีที่แนะนำน้อยกว่าในการเก็บเวอร์ชันเก่าไว้โดยไม่ต้องใช้bundle execคือการถอนการติดตั้งคราดเวอร์ชันที่ใหม่กว่า

$ gem ถอนการติดตั้งคราด

เลือกอัญมณีที่จะถอนการติดตั้ง:
 1. คราด -0.8.7
 2. คราด -0.9.2
 3. ทุกรุ่น
> 2
ถอนการติดตั้ง rake-0.9.2 สำเร็จแล้ว

วิธีนี้ใช้งานได้ แต่ถ้าคุณกำลังทำงานกับหลายแอพที่ใช้คราดเวอร์ชันต่างกันอาจเป็นความเจ็บปวดเพราะคุณจะพบว่าตัวเองต้องติดตั้งและถอนการติดตั้งเวอร์ชันต่างๆอยู่ตลอดเวลา


สิ่งนี้ได้ผลสำหรับฉัน ด้วยเหตุผลบางประการจึงมีการติดตั้งเพียงเวอร์ชันเดียว (0.8.7) gem install rakeดังนั้นแรกที่ผมทำ จากนั้นgem uninstall rakeเลือก 0.9.2
B เซเว่น

7
bundle updateจะอัปเดตอัญมณีใด ๆ ที่ไม่มีเวอร์ชันที่ระบุเป็นเวอร์ชันล่าสุดที่มีให้ นั่นอาจไม่ใช่สิ่งที่คุณต้องการ bundle update rakeจะมีมากขึ้น
Alex Neth

ฉันมีปัญหาเดียวกันกับแทนpublic_suffix rakeการวิ่งbundle update public_suffixไม่มีผล แต่น่าเสียดาย
Dmitri Zaitsev

54

ลอง bundle clean --force

มันจะลบเจมระบบทั้งหมดที่ไม่ได้อยู่ในบันเดิลนี้


13

ครั้งล่าสุดที่สิ่งนี้เกิดขึ้นกับฉันฉันได้อัปเดตอัญมณีทั้งหมดของฉัน ฉันทำgem uninstall rakeรายการตัวเลือกเวอร์ชันแล้ว ฉันเลือกอันใหม่กว่าแล้วก็ไม่ต้องใช้bundle execอีกต่อไป

โดยพื้นฐานแล้วหากคุณใช้bundle execมันจะใช้เวอร์ชันอัญมณีใด ๆ ที่บันเดิลของคุณติดตั้งไว้ดังนั้นสิ่งที่อยู่ใน Gemfile โดยไม่bundle execใช้เวอร์ชันใดก็ตามที่เป็นค่าเริ่มต้นระบบ


8

Ooh! บทความ Katz นั้นยอดเยี่ยมมาก!

ฉันชอบวิธีนี้มากที่สุด:

bundle install --binstubs

เพื่อให้คุณสามารถพิมพ์ได้

bin/rake .stuff.

สำหรับคนอย่างตัวฉันเองที่กำลังพัฒนาแอพทั้ง 2.3 และ 3.0.9 สิ่งนี้ทำให้ฉันรู้สึกดีขึ้นมาก


8

bundle exec ถูกต้อง แต่คุณไม่ต้องการพิมพ์ทุกครั้ง

คุณสามารถใส่สิ่งนี้ใน. bashrc ของคุณ:

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

เพื่อความชัดเจนไฟล์. bashrc อาจอยู่ในไดเร็กทอรีหลักของคุณ [~ / .bashrc] ไฟล์นี้จะโหลดทุกครั้งที่คุณเปิดหน้าต่างเทอร์มินัลใหม่
Ryan

0

อีกวิธีหนึ่งในการไม่พิมพ์ทุกครั้งคือใช้ Makefile เช่น

rake :
    bundle exec rake
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.