Không thực hiện bó rake có nghĩa là gì?


350

bundle exec rake db:migratenghĩa là gì? Hay chỉ bundle exec rake <command>nói chung?

Tôi hiểu rằng bundlechăm sóc duy trì mọi thứ trong Gemfile. Tôi biết từ "exec" nghĩa là gì. Tôi hiểu rằng rakeduy trì tất cả những điều kinh điển khác nhau mà bạn có thể làm, và tôi biết đó db:migratelà một trong những điều đó. Tôi chỉ không biết những gì những từ này đang làm cùng nhau. Tại sao nên bundleđược sử dụng để thực thi rakeđể thực hiện di chuyển cơ sở dữ liệu?

Câu trả lời:


468

bundle execlà một lệnh Bundler để thực thi một tập lệnh trong ngữ cảnh của gói hiện tại (tập lệnh từ Gemfile của thư mục của bạn ). rake db:migratelà tập lệnh trong đó db là không gian tên và di chuyển là tên tác vụ được xác định.

Vì vậy, bundle exec rake db:migratethực thi kịch bản rake với lệnh db:migratetrong ngữ cảnh của gói hiện tại.

Như "tại sao?" Tôi sẽ trích dẫn từ trang bundler :

Trong một số trường hợp, chạy thực thi mà không bundle execcó thể hoạt động, nếu thực thi được cài đặt trong hệ thống của bạn và không kéo theo bất kỳ đá quý nào xung đột với gói của bạn.

Tuy nhiên, điều này là không đáng tin cậy và là nguồn gốc của nỗi đau đáng kể. Ngay cả khi nó trông giống như nó hoạt động, nó có thể không hoạt động trong tương lai hoặc trên một máy khác.


7
Điều đó có nghĩa là chúng ta nên luôn luôn chạy exec exec, tôi đã sử dụng trình quản lý phiên bản ruby ​​để cài đặt ruby ​​và ruby ​​trên đường ray.
Pradeep Sharma

11
@Edmund Một "bó" là một từ tiếng Anh, có nghĩa là một nhóm những thứ tương tự, thường được buộc gọn gàng. Cụ thể trong câu hỏi này, nó đề cập đến một nhóm Đá quý (thư viện mã ruby ​​độc lập.) Bundler là tên của phần mềm mà chúng tôi đang sử dụng ở đây để quản lý Đá quý. Và bundlelà lệnh được sử dụng bởi Bundler.
ghoppe

2
Tôi có ấn tượng rằng bất cứ khi nào chúng tôi cd vào một thư mục bằng Gemfile, shell sẽ tự động sử dụng các phiên bản được chỉ định trong Gemfile (ví dụ: phiên bản Ruby). Dựa trên giả định đó, tôi nghĩ rake db: di chuyển sẽ luôn chạy tốt mà không cần thực thi gói. CMIIW
Pahlevi Fikri Auliya

1
@PahleviFikriAuliya chỉ đúng nếu bạn có một .ruby-gemsettệp trong thư mục gốc của dự án. Ngoài ra còn có một .ruby-versiontập tin đặt phiên bản ruby ​​của bạn nếu sử dụng RVM.
Cá trê

1
Trang được liên kết không còn đề cập đến trích dẫn bạn đã chỉ định. Hãy sửa chữa, cảm ơn.
Gaurang Tandon

153

Bạn đang chạy bundle exectrên một chương trình. Những người tạo ra chương trình đã viết nó khi có một số phiên bản đá quý nhất định. Chương trình Gemfile chỉ định các phiên bản đá quý mà người tạo đã quyết định sử dụng. Đó là, kịch bản được tạo ra để chạy chính xác với các phiên bản đá quý này.

Gemfile trên toàn hệ thống của bạn có thể khác với Gemfile này. Bạn có thể có đá quý mới hơn hoặc cũ hơn mà kịch bản này không chơi tốt. Sự khác biệt trong các phiên bản này có thể cung cấp cho bạn các lỗi kỳ lạ.

bundle execgiúp bạn tránh những lỗi này. Nó thực thi tập lệnh bằng cách sử dụng các viên đá quý được chỉ định trong Gemfile của tập lệnh chứ không phải là Gemfile trên toàn hệ thống. Nó thực hiện các phiên bản đá quý nhất định với phép thuật của bí danh vỏ.

Xem thêm trên trang người đàn ông .

Dưới đây là một ví dụ về Gemfile:

source 'http://rubygems.org'

gem 'rails', '2.8.3'

Ở đây, bundle execsẽ thực thi tập lệnh bằng cách sử dụng phiên bản rails 2.8.3 chứ không phải một số phiên bản khác mà bạn có thể đã cài đặt trên toàn hệ thống.


9
Tôi thích câu trả lời này hơn là lựa chọn của OP: D! Rõ ràng hơn nhiều.
mauricioschneider 17/12/13

1
Vì vậy, để thêm vào ví dụ này: nếu người đó đơn giản rake db:migratebỏ đi bundle execthì nó sẽ thực thi bằng Gemfile trên toàn hệ thống, nơi người ta có thể có giá ở mức 1.5.2 (mới nhất)?
Smokin Joe

câu trả lời tốt hơn nhiều, với các ví dụ cụ thể.
ahnbizcad 8/2/2015

2
Vì vậy, hãy bundle execsử dụng "đá quý dành riêng cho ứng dụng", đá quý cục bộ trong Gemfile của ứng dụng của bạn và bundlesử dụng "đá quý toàn cầu" dành riêng cho máy tính nếu bạn đã làm gem install a_certain_gem. địa phương vs toàn cầu
ahnbizcad

Câu trả lời tốt hơn nhiều so với câu hỏi được chọn.
Boon

9

Điều này xuất hiện rất nhiều khi gemfile.lock của bạn có các phiên bản đá quý khác nhau được cài đặt trên máy của bạn. Bạn có thể nhận được cảnh báo sau khi chạy cào (hoặc rspec hoặc người khác), chẳng hạn như:

You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.

Thêm vào trước bundle execkể bundler để thực hiện lệnh này không phân biệt sự khác biệt giữa phiên bản. Không phải lúc nào cũng có vấn đề, tuy nhiên, bạn có thể gặp vấn đề.

May mắn thay, có một loại đá quý giải quyết điều này: rubygems-bundler.

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

Sau đó thử cào, rspec, hoặc bất cứ điều gì một lần nữa.


Vẫn là một giải pháp tuyệt vời vào năm 2020.
Brateq

6

Có lẽ nên đề cập rằng, có nhiều cách để bỏ qua bundle exec(tất cả chúng đều được nêu trong chương 3.6.1 của cuốn sách Michael Hartls Ruby on Rails Tutorial ).

Đơn giản nhất là chỉ cần sử dụng phiên bản RVM đủ cập nhật (> = 1.11.x).

Nếu bạn bị giới hạn ở phiên bản RVM trước đó, bạn luôn có thể sử dụng phương pháp này cũng được đề cập bởi calasyr :

$ rvm get head && rvm reload
$ chmod +x $rvm_path/hooks/after_cd_bundler
$ bundle install --binstubs=./bundler_stubs

Thư mục bundler_stubssau đó cũng nên được thêm vào .gitignoretập tin.

Tùy chọn thứ ba là sử dụng rubygems-bundlerđá quý nếu bạn không sử dụng RVM:

$ gem install rubygems-bundler
$ gem regenerate_binstubs

1

Khi bạn trực tiếp chạy tác vụ cào hoặc thực hiện bất kỳ tệp nhị phân nào của đá quý, không có gì đảm bảo rằng lệnh sẽ hoạt động như mong đợi. Bởi vì có thể bạn đã cài đặt cùng loại đá quý trên hệ thống có phiên bản 1.0 nhưng trong dự án của bạn, bạn có phiên bản cao hơn là 2.0. Trong trường hợp này, bạn không thể dự đoán cái nào sẽ được sử dụng.

Để thực thi phiên bản đá quý mong muốn, bạn cần có sự trợ giúp của bundle execlệnh sẽ thực thi nhị phân trong ngữ cảnh của gói hiện tại. Điều đó có nghĩa là khi bạn sử dụng bundle exec, bundler kiểm tra phiên bản đá quý được cấu hình cho dự án hiện tại và sử dụng nó để thực hiện nhiệm vụ.

Tôi cũng đã viết một bài về nó cũng cho thấy làm thế nào chúng ta có thể tránh sử dụng nó bằng cách sử dụng các cuống bin.


1

Tôi chưa sử dụng bundle execnhiều, nhưng hiện đang thiết lập nó.

Tôi đã có những trường hợp sử dụng cào sai và lãng phí nhiều thời gian để theo dõi vấn đề. Điều này giúp bạn tránh điều đó.

Đây là cách thiết lập RVM để bạn có thể sử dụng bundle exectheo mặc định trong một thư mục dự án cụ thể:

https: // Dùtbot.com/blog/use-bundlers-binstub


0

Điều đó có nghĩa là sử dụng rake mà trình đóng gói nhận biết và là một phần của Gemfile của bạn đối với bất kỳ chương trình cào nào mà trình biên dịch không biết và chạy tác vụ db: di chuyển.

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.