Bạn đã kích hoạt X, nhưng Gemfile của bạn yêu cầu Y


128

Khi chạy raketôi gặp lỗi này:

Bạn đã kích hoạt rake 0.9.2, nhưng Gemfile của bạn yêu cầu rake 0.8.7. Xem xét sử dụng bó thực thi.

Sử dụng bundle exec rakethay vì chỉ rakecó vẻ hiệu quả, nhưng nó là cách tốt nhất để khắc phục điều này?


Đây cũng là điều làm cho RVM trở thành một công cụ tuyệt vời. Nó sẽ cho phép bạn có một bộ đá quý riêng cho từng dự án này để bạn không phải lo lắng về điều này xảy ra lần nữa.
rm-rf

Câu trả lời:


84

Sử dụng bundle exec cách đúng đắn để làm điều này.

Về cơ bản những gì đang xảy ra là bạn đã cập nhật rake thành 0.9.2, hiện đang mâu thuẫn với phiên bản được chỉ định trong Gemfile của bạn. Trước đây, phiên bản mới nhất của rakebạn đã khớp với phiên bản trong Gemfile của bạn, vì vậy bạn không nhận được bất kỳ cảnh báo nào khi chỉ cần sử dụng rake.

Yehuda Katz (một trong những nhà phát triển Bundler gốc) giải thích tất cả trong bài đăng trên blog này .

Để tránh gõ bundle exec ...mọi lúc, bạn có thể thiết lập bí danh hoặc hàm trong trình bao của mình cho các lệnh bạn thường sử dụng với Bundler. Ví dụ: đây là những gì tôi sử dụng cho Rake:

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

5
Bài viết trên blog không thực sự giải thích nhiều. Câu hỏi thực sự là: tại sao viên ruby ​​không có được sự phụ thuộc đúng và tại sao sau đó lại phàn nàn về việc có sai?
Otheus

64

Nếu bạn có lý do để giữ phiên bản hiện tại của cào (hoặc bất kỳ loại đá quý nào khác gây ra sự cố), matt là chính xác, cách tốt nhất để làm điều này là chạy bundle exec. Điều này sử dụng phiên bản được chỉ định trong Gemfile của bạn thay vì sử dụng phiên bản mới nhất của đá quý bạn đã cài đặt. (nathan.f77 có một giải pháp tốt dưới đây nếu bạn không muốn gõ bundle execmỗi khi bạn chạy cào)

Mặt khác, nếu không có lý do gì để không cập nhật rake, bạn có thể chạy

bundle update rake

Điều này thực sự sẽ cập nhật Gemfile.lock của bạn để sử dụng phiên bản cào mới nhất thay vì phải chạy bundle execmỗi lần.

Lưu ý: nếu bạn chỉ chạy, bundle updateđiều này sẽ cập nhật tất cả các viên ngọc trong Gemfile của bạn thay vì chỉ cào, đó có thể không phải là thứ bạn muốn, bởi vì nếu có thứ gì đó bị hỏng trong ứng dụng của bạn, bạn sẽ không biết bản cập nhật đá quý nào gây ra.


Cách ít được đề xuất hơn để giữ phiên bản cũ hơn mà không phải sử dụng bundle execlà gỡ cài đặt các phiên bản mới hơn của cào.

$ gem gỡ cào

Chọn đá quý để gỡ cài đặt:
 1. cào-0.8.7
 2. cào-0.9.2
 3. Tất cả các phiên bản
> 2
Đã gỡ cài đặt thành công rake-0.9.2

Điều này hoạt động, nhưng nếu bạn đang làm việc với nhiều ứng dụng sử dụng các phiên bản cào khác nhau, điều này có thể gây khó khăn vì bạn sẽ thấy mình liên tục phải cài đặt và gỡ cài đặt các phiên bản khác nhau.


Điều này làm việc cho tôi. Vì một số lý do, chỉ có một phiên bản (0.8.7) được cài đặt. Vì vậy, đầu tiên tôi đã làm gem install rake. Sau đó gem uninstall rakevà chọn 0.9.2.
B Bảy

7
bundle updatecũng sẽ cập nhật bất kỳ đá quý nào mà không có phiên bản được chỉ định cho phiên bản mới nhất hiện có. Đó có thể không phải là những gì bạn muốn. bundle update rakesẽ được nhiều ưu tiên hơn.
Alex Neth

Tôi có cùng một vấn đề với public_suffixthay vì rake. Chạy bundle update public_suffixkhông có tác dụng, thật không may.
Dmitri Zaitsev

53

Thử bundle clean --force

Nó loại bỏ mọi đá quý hệ thống không có trong gói này


13

Lần trước điều này xảy ra với tôi, tôi đã cập nhật tất cả đá quý của mình. Tôi đã làm một gem uninstall rakevà nó liệt kê các tùy chọn phiên bản. Tôi đã chọn cái mới hơn và sau đó tôi không phải sử dụng bundle execnữa.

Về cơ bản, nếu bạn sử dụng bundle execnó sẽ sử dụng bất kỳ phiên bản đá quý nào được cài đặt bởi gói của bạn, vậy thì có gì trong Gemfile. Không có bundle execnó sử dụng bất cứ phiên bản nào là hệ thống mặc định của bạn.


8

Ôi! Bài viết Katz là tuyệt vời!

Tôi thích giải pháp này tốt nhất:

bundle install --binstubs

để bây giờ bạn có thể gõ

bin/rake .stuff.

Đối với một người như tôi đang phát triển cả ứng dụng 2.3 và 3.0.9, điều này khiến tôi cảm thấy tốt hơn rất nhiều.


8

bundle exec là chính xác, nhưng bạn không muốn gõ nó mỗi lần.

Bạn có thể đặt cái này trong .bashrc:

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

Để làm rõ, tệp .bashrc có thể nằm trong thư mục chính của bạn [~ / .bashrc]. Tập tin này được tải mỗi khi bạn mở một cửa sổ terminal mới.
Ryan

0

Một cách khác để không gõ nó mỗi lần là với Makefile, ví dụ

rake :
    bundle exec rake
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.