2011-07-05 52 views
299

bundle exec rake db:migrate có nghĩa là gì? Hoặc chỉ cần bundle exec rake <command> nói chung?Trình quản lý gói có nghĩa là gì?

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

Trả lời

406

bundle exec là lệnh Bundler để thực thi tập lệnh trong ngữ cảnh của gói hiện tại (một từ thư mục của bạn là Gemfile). rake db:migrate là 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:migrate thực thi tập lệnh rake bằng lệnh db:migrate trong ngữ cảnh của gói hiện tại.

Đối với "tại sao?" Tôi sẽ báo giá từ bundler page:

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

Tuy nhiên, điều này không đáng tin cậy và là nguồn gây đau đáng kể. Ngay cả khi nó có vẻ 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.

+3

Cảm ơn bạn, rất giáo dục. – JnBrymn

+0

giải thích tốt nhất ý nghĩa của gói exec. Cảm ơn. – rmagnum2002

+7

Điều đó có nghĩa là chúng ta nên chạy bó 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. –

0

Điều đó có nghĩa là sử dụng cào mà trình bao đã biết và là một phần của Gemfile của bạn trên bất kỳ cào nào mà trình chặn không biết và chạy tác vụ db: migrate.

1

Tôi chưa sử dụng trình quản lý gói nhiều, nhưng tôi đang thiết lập nó bây giờ.

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

Dưới đây là cách thiết lập RVM do đó bạn có thể sử dụng bó exec theo mặc định trong thư mục dự án cụ thể:

http://robots.thoughtbot.com/post/15346721484/use-bundlers-binstubs

125

Bạn đang chạy bundle exec trên một chương trình. Những người sáng tạo của 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 của những viên đá quý mà người sáng tạo đã quyết định sử dụng. Đó là, kịch bản đã được thực hiện để chạy một cách chính xác với các phiên bản đá quý này.

Gemfile 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 đẹp. Sự khác biệt này trong phiên bản có thể cho bạn những lỗi lạ.

Bundle exec giúp bạn tránh các lỗi này. Nó thực hiện kịch bản bằng cách sử dụng các gem được chỉ định trong Gemfile của kịch bản chứ không phải là Gemfile toàn hệ thống. Nó thực hiện các phiên bản đá quý nhất định với sự kỳ diệu của bí danh vỏ.

Xem thêm trên the man page.

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

source 'http://rubygems.org' 

gem 'rails', '2.8.3' 

Ở đây, bundle exec sẽ thực thi kịch bản sử dụng đường ray phiên bản 2.8.3 và không một số phiên bản khác mà bạn có thể đã cài đặt toàn hệ thống.

+9

Tôi thích câu trả lời này tốt hơn lựa chọn của OP: D! Rõ ràng hơn nhiều. – lemavri

+1

Vì vậy, để thêm vào ví dụ này: nếu người đó chỉ cần chạy 'rake db: migrate' để thoát khỏi' bundle exec' thì nó sẽ thực thi bằng cách sử dụng một Gemfile toàn hệ thống, nơi người ta có thể có giá tại 1.5.2 (mới nhất)? –

+0

Giải thích tốt nhất và dễ hiểu nhất. – JVK

6

Nó có lẽ nên được đề cập, 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 sách Michael Hartls Ruby on Rails Tutorial).

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

Nếu bạn đang giới hạn ở một phiên bản trước của RVM, 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_stubs nên sau đó cũng được thêm vào tập tin .gitignore.

Một lựa 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 
7

này đi lên rất nhiều khi gemfile.lock của bạn có các phiên bản khác nhau của đá quý được cài đặt trên máy tính của bạn. Bạn có thể nhận được một cảnh báo sau khi chạy cào (hoặc rspec hoặc những người khác) 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.

prepending bundle exec kể 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 viên ngọc giải quyết vấn đề này: rubygems-bundler.

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

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

+0

Excelent! Giải quyết – mariowise

Các vấn đề liên quan