bundle-exec - hướng dẫn tham khảo, tùy chọn, ví dụ về lệnh


TÊN

bundle-exec - Thực hiện một lệnh trong ngữ cảnh của gói

TÓM TẮT

bundle exec [--keep-file-descriptors] command

SỰ MIÊU TẢ

Lệnh này thực thi lệnh, làm cho tất cả đá quý được chỉ định trong [Gemfile(5)][Gemfile(5)] có sẵn để require trong các chương trình Ruby.

Về cơ bản, nếu bạn thường chạy thứ gì đó như rspec spec/my_spec.rb và bạn muốn sử dụng các loại đá quý được chỉ định trong [Gemfile(5)][Gemfile( 5)] và được cài đặt qua bundle install(1) bundle-install.1.html, bạn nên chạy bundle exec rspec spec/my_spec.rb.

Lưu ý rằng bundle exec không yêu cầu phải có tệp thực thi trên ` PATH của trình bao của bạn.

TÙY CHỌN

--keep-file-descriptors

Exec trong Ruby 2.0 đã bắt đầu loại bỏ các bộ mô tả tệp không chuẩn. Khi cờ này được thông qua, exec sẽ trở lại hành vi 1.9 chuyển tất cả các bộ mô tả tệp sang quy trình mới.

CÀI ĐẶT GÓI --BINSTUBS

Nếu bạn sử dụng cờ --binstubs trong gói cài đặt(1) bundle-install.1.html, Bundler sẽ tự động tạo một thư mục (mặc định là app_root/bin) chứa tất cả các tệp thực thi có sẵn từ các viên ngọc trong gói.

Sau khi sử dụng --binstub, bin/rspec spec/my_spec.rb giống với bundle exec rspec spec/my_spec.rb.

THAY ĐỔI MÔI TRƯỜNG

bundle exec thực hiện một số thay đổi đối với môi trường trình bao, sau đó thực thi đầy đủ lệnh mà bạn chỉ định.

  • đảm bảo rằng vẫn có thể trình bao ra bundle từ bên trong lệnh được gọi bởi bundle exec (sử dụng $BUNDLE_BIN_PATH)

  • đặt thư mục chứa các tệp thực thi (như rails, rspec, rackup) cho gói của bạn trên ` PATH

  • đảm bảo rằng nếu trình đóng gói được gọi trong lớp con, nó sẽ sử dụng cùng một Gemfile (bằng cách đặt BUNDLE_GEMFILE)

  • thêm -rbundler/setup vào $RUBYOPT để đảm bảo rằng các chương trình Ruby được gọi trong lớp con có thể nhìn thấy các viên ngọc trong gói

Nó cũng sửa đổi Rubygems:

  • không cho phép tải thêm đá quý không có trong gói

  • sửa đổi phương thức gem thành không hoạt động nếu đá quý phù hợp với yêu cầu có trong gói và tăng Gem::LoadError nếu không

  • Xác định Gem.refresh là không hoạt động, vì chỉ mục nguồn luôn bị đóng băng khi sử dụng trình đóng gói và để ngăn đá quý từ hệ thống rò rỉ ra môi trường

  • Ghi đè Gem.bin_path để sử dụng các viên ngọc trong gói, làm cho các tệp thực thi của hệ thống hoạt động

  • Thêm tất cả đá quý trong gói vào Gem.loaded_specs

Cuối cùng, bundle exec cũng ngầm sửa đổi Gemfile.lock nếu lockfile và Gemfile không khớp. Bundler cần Gemfile để xác định những thứ như nhóm của đá quý, yêu cầu tự động và nền tảng, v.v. và thông tin đó không được lưu trữ trong tệp khóa. Gemfile và lockfile phải được đồng bộ hóa để bundle exec thành công, vì vậy bundle exec cập nhật lockfile trước.

Đang tải

Theo mặc định, khi cố gắng gói exec cho một tệp có shebang ruby, Bundler sẽ Kernel.load tệp đó thay vì sử dụng Kernel.exec. Đối với phần lớn các trường hợp, đây là một cải tiến hiệu suất. Trong một số ít trường hợp, điều này có thể gây ra một số tác dụng phụ nhỏ (chẳng hạn như phụ thuộc vào nội dung chính xác của $0 hoặc __FILE__) và tối ưu hóa có thể bị tắt bằng cách bật cài đặt disable_exec_load.

Bắn phá ra

Bất kỳ mã Ruby nào mở một lớp con (như system, backticks hoặc %x{}) sẽ tự động sử dụng môi trường Bundler hiện tại. Nếu bạn cần trình bày một lệnh Ruby không có trong gói hiện tại của mình, hãy sử dụng phương thức with_unbundled_env với một khối. Bất kỳ lớp vỏ con nào được tạo bên trong khối sẽ được cung cấp môi trường hiện tại trước khi Bundler được kích hoạt. Ví dụ: các lệnh Homebrew chạy Ruby, nhưng không hoạt động bên trong một gói:

Bundler.with_unbundled_env do
  `brew install wget`
end

Việc sử dụng with_unbundled_env cũng cần thiết nếu bạn đang tìm kiếm một gói khác. Bất kỳ lệnh Bundler nào chạy trong một lớp con sẽ kế thừa Gemfile hiện tại, vì vậy các lệnh cần chạy trong ngữ cảnh của một gói khác cũng cần sử dụng with_unbundled_env.

Bundler.with_unbundled_env do
  Dir.chdir "/other/bundler/project" do
    `bundle exec ./script`
  end
end

Bundler cung cấp các trình trợ giúp tiện lợi bao bọc system và exec và chúng có thể được sử dụng như sau:

Bundler.clean_system('brew install wget') 
Bundler.clean_exec('brew install wget')

BỔ SUNG RUBYGEMS

Hiện tại, hệ thống plugin Rubygems yêu cầu tất cả các tệp có tên rubygems_plugin.rb trên đường dẫn tải của viên ngọc được cài đặt bất kỳ khi bất kỳ mã Ruby nào yêu cầu rubygems.rb . Điều này bao gồm các tệp thực thi được cài đặt vào hệ thống, như đường ray, rackup và rspec.

Vì các plugin Rubygems có thể chứa mã Ruby tùy ý, chúng thường tự kích hoạt hoặc các phần phụ thuộc của chúng.

Ví dụ: đá quý gemcutter 0.5 phụ thuộc vào json_pure. Nếu bạn đã cài đặt phiên bản gemcutter đó (ngay cả khi bạn cũng có phiên bản mới hơn mà không gặp sự cố này), thì Rubygems sẽ kích hoạt gemcutter 0.5 và json_pure .

Nếu Gemfile(5) của bạn cũng chứa json_pure (hoặc một viên ngọc phụ thuộc vào json_pure), thì phiên bản mới nhất trên hệ thống của bạn có thể xung đột với phiên bản trong Gemfile(5) hoặc phiên bản ảnh chụp nhanh trong Gemfile.lock của bạn.

Nếu điều này xảy ra, bundler sẽ nói:

You have already activated json_pure 1.4.6 but your Gemfile
requires json_pure 1.4.3. Consider using bundle exec.

Trong tình huống này, bạn gần như chắc chắn muốn xóa đá quý cơ bản bằng plugin đá quý có vấn đề. Nói chung, tác giả của những phần bổ trợ này (trong trường hợp này là đá quý gemcutter) đã phát hành các phiên bản mới hơn cẩn thận hơn trong phần bổ trợ của họ.

Bạn có thể tìm thấy danh sách tất cả các đá quý có chứa các plugin đá quý bằng cách chạy

ruby -e "puts Gem.find_files('rubygems_plugin.rb')"

Ít nhất, bạn nên xóa tất cả, trừ phiên bản mới nhất của mỗi plugin đá quý, đồng thời xóa tất cả các plugin đá quý mà bạn không sử dụng (gỡ cài đặt đá quý gem_name).