Sử dụng gói thực thi rake hay chỉ rake?


81

Tôi đã học Rails chỉ bằng lệnh rake như rake db:migrate; tuy nhiên, tôi đọc rằng tôi nên sử dụng bundle exec rake ...thay vì chỉ đơn giản rake. Bây giờ tôi bối rối không biết sử dụng cái nào.

Tôi có nên sử dụng bundle exec rakethay vì chỉ đơn thuần rakehay đó chỉ là một điều ưu tiên? Bất kỳ cái nhìn sâu sắc sẽ được nhiều đánh giá cao! Cảm ơn!

Câu trả lời:


126

bundle exec thực hiện một lệnh trong ngữ cảnh của gói của bạn.

Điều đó có nghĩa là nó sử dụng các đá quý được chỉ định trong Gemfile của bạn. Phần lớn thời gian, việc chạy bundle exec rake foocó kết quả giống như khi bạn vừa chạy rake foo, đặc biệt nếu bạn đã cài đặt cùng một loại đá quý trên toàn hệ thống như trong Gemfile của mình. Tuy nhiên, một số ứng dụng có thể chỉ định các phiên bản đá quý khác với phiên bản bạn đã cài đặt trên toàn hệ thống và có thể muốn các phiên bản và đá quý chính xác đó có thể chạy chính xác. Nếu bạn chỉ chạy mà không có bundle exec, bạn có thể gặp một số lỗi kỳ lạ.

Sử dụng bundle execđảm bảo rằng chương trình được chạy với môi trường được chỉ định trong gemfile, điều này hy vọng có nghĩa là nó là môi trường mà người tạo chương trình muốn nó được chạy trong đó, hy vọng có nghĩa là nó sẽ chạy chính xác bất kể bạn có thiết lập kỳ lạ nào máy tính của bạn.

Về cơ bản, nó chuẩn hóa môi trường mà chương trình được chạy. Điều này giúp tránh địa ngục phiên bản và làm cho cuộc sống dễ dàng hơn nhiều.

Xem http://bundler.io/v1.3/man/bundle-exec.1.html để biết thêm thông tin.


4
Nếu bạn cảm thấy mệt mỏi của gõ bó exec tất cả các thời gian, bạn có thể cấu hình RVM vì vậy nó không cần thiết: ruby.railstutorial.org/chapters/...
Lance Fisher

1
Lưu ý: Trang man Các Bundle thay đổi, đúng vào ngày này là: bundler.io/v1.3/man/bundle-exec.1.html
Americo Savinon

1
Một tác dụng phụ hay của việc sử dụng bundle execlà nó cũng sẽ cho bạn biết liệu bạn có nên chạy bundle installđể cài đặt các phiên bản gems mà bạn đang thiếu so với tệp Gemfile.lock hay không.
Jay Mitchell

Bạn đã giải thích nó rất tốt .. Cảm ơn.
Arup Rakshit

5

$
pack execute rake db: migrate Sử dụng phiên bản rake được chỉ định trong Gemfile để thực thi tác vụ rake db:migrate.

Nhưng không có viên ngọc cào được chỉ định trong Gemfile!
Có, nhưng một viên ngọc rake đã được cài đặt như một phụ thuộc của một số viên ngọc khác - hãy xem trong Gemfile.lock. Vì vậy, quy tắc phải là: Sử dụng phiên bản rake được chỉ định trong Gemfile.lock.

Nhưng Gemfile.lock không chỉ định một phiên bản cụ thể - nó chỉ định một phiên bản lớn hơn xy!
Sau đó, quy tắc phải là: Sử dụng phiên bản rake đã được cài đặt trong gemset hiện tại.

$ rake db: migrate
Thông thường, khi bạn đưa ra một lệnh trên dòng lệnh, ví dụ như rake, hệ thống của bạn sẽ tìm kiếm lệnh trong danh sách các thư mục được chỉ định trong biến môi trường PATH của bạn. Thư mục đầu tiên chứa lệnh là phiên bản của lệnh được sử dụng. Để xem đó là thư mục nào, bạn có thể thực hiện:

$ which rake

Vì vậy, nếu bạn thực hiện,

$ rake db:migrate

rằng có thể sử dụng một viên ngọc cào khác nhau so với cái bạn cài đặt với bundle install. Tuy nhiên, ngay cả khi hệ thống của bạn tìm thấy phiên bản rake giống như vậy bundle exec, bất kỳ viên ngọc nào theo yêu cầu của mã nguồn rake sẽ được tìm kiếm ở những nơi bên ngoài gemset của dự án của bạn. Do đó, có nhiều cách chỉ:

$ rake db:migrate

có thể làm rối tung mọi thứ.

Theo Sách Hướng dẫn Ruby on Rails (miễn phí trực tuyến), phần 3.6, nếu bạn đang sử dụng rvm 1.11.x + thì bạn không cần phải mở đầu các lệnh với bundle exec.


1

chạy bất kỳ exacutable nào mà không bundle execcó Rubygems sẽ tìm nạp phiên bản mới nhất của gem được cài đặt trong hệ thống của bạn.

bundle execThay vào đó, bằng cách thêm tiền tố sẽ có tệp thực thi chạy trong ngữ cảnh của Gemfile.lock, có nghĩa là tệp đó sẽ được chạy bằng phiên bản được xác định trong tệp đá quý.

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.