使用和不使用 bundle exec 运行 rake 命令的主要区别是什么?
我看到很少有帖子说,当您使用 bundle exec 运行命令时,它将在 gem 文件中定义的 gems 版本的范围内运行。如果是这种情况,那么应该强制使用 rake 命令运行bundle exec
?
使用和不使用 bundle exec 运行 rake 命令的主要区别是什么?
我看到很少有帖子说,当您使用 bundle exec 运行命令时,它将在 gem 文件中定义的 gems 版本的范围内运行。如果是这种情况,那么应该强制使用 rake 命令运行bundle exec
?
bundle exec rake some:task
在你的包的上下文中运行 rake 任务。
你没有明确提到 Rails,但我看到你的帖子被标记为 Rails,所以一个人为的例子可能如下:
whateva-whateva
您出于某种正当理由在系统上安装 了虚拟 gem 的 2.0 版。
你决定要从某个地方拉下一个旧的 Rails 项目以检查它并bundle install
在克隆项目的根文件夹中运行。该命令将安装 Rails 应用程序所需的所有 gem,其中一个恰好是虚拟whateva-whateva
gem 的 1.0 版。
所以目前的状态是这样的:你的旧 Rails 应用程序有一个 gem 包,其中包含旧版本的whateva-whateva
和你的系统范围的 gem 包括新版本的whateva-whateva
gem。
当您运行与 Rails 应用程序相关的 rake 任务时,您希望加载哪个版本?当然是年纪大的。
为了做到这一点,你可以使用bundle exec rake the:task
它并在你的包的上下文中运行 rake 命令——旧版本的 gem 加上旧 Rails 应用程序的 Gemfile 中指定的任何其他内容。
所以是的,毕竟,我认为可以肯定地说,最好的做法是你应该总是预先bundle exec
准备,但老实说,我很懒惰,除非我发现问题,否则很少这样做。
在其他新闻中,如果您使用 Bundler 的 binstubs,则无需添加它。这是设置它的链接:https ://thoughtbot.com/blog/use-bundlers-binstubs
BUNDLE_GEMFILE=/path/to/gemfile bundle exec
可用于任何命令之前(如果BUNDLE_GEMFILE
未指定,则搜索文件系统并使用找到的第一个命令),而不仅仅是rake
.
您运行的任何命令都可能调用可执行的 Ruby 命令(例如rake
)或需要来自 Ruby 库(例如Rake::Task
类)的代码,这些东西通常由 gems 提供。 gem env
告诉您 gem 提供的库和可执行文件在哪里。但是,如果您使用bundle exec
它将可用的 gem 限制为与您的上下文正在使用的Gemfile.lock
文件关联的文件中指定的那些。Gemfile
bundle exec
bundle exec
出于以下几个原因,使用机器上所有可用的 gem(如果不这样做可能会发生)可能是不可取的:
这是查看差异的快速方法。
gem install thin
foo
包含两个文件的目录:一个空 Gemfile 和一个foo.rb
包含以下内容的文件:#! /usr/bin/ruby (or whatever the path to your system Ruby is)
require 'thin'
foo.rb
可执行。thin
和./foo.rb
从命令行都可以工作,但在任何一个之前都bundle exec
不起作用。如果您bundle exec
在 rails 中的任何命令之前使用,它将在应用程序主文件夹中搜索我们的 Gemfile 中提到的 Gems。
假设,您有 2 个应用程序,并为每个应用程序使用不同的 ruby 版本。如果没有 bundle exec,该命令可能无法运行,因为它可能需要不同版本的 Gem 来运行该任务。但是如果您开始使用bundle exec
它将需要确切的 gem 版本来运行任务/应用程序。
I recommend you to use **bundle exec** before any command.
bundle-exec - 在包的上下文中执行命令
该命令执行该命令,使 Gemfile(5) 中指定的所有 gem 都可以在 Ruby 程序中使用。
它不是唯一的 rake,而是适用于 rails、rspec、rackup 命令。
本质上,如果您通常会运行 rspec spec/my_spec.rb 之类的东西,并且想要使用 Gemfile(5) 中指定并通过 bundle install(1) 安装的 gem,则应该运行 bundle exec rspec spec/my_spec。 rb。
请注意,bundle exec 不需要可执行文件在您的 shell 的 $PATH 上可用。
有关更多详细信息,请查看bundle exec doc。