【发布时间】:2013-05-04 20:13:18
【问题描述】:
使用和不使用 bundle exec 运行 rake 命令的主要区别是什么?
我看到很少有帖子指出,当您使用 bundle exec 运行命令时,它将在 gem 文件中定义的 gems 版本的范围内运行。如果是这种情况,那么应该强制使用 bundle exec 运行 rake 命令?
【问题讨论】:
标签: ruby-on-rails ruby rake bundle
使用和不使用 bundle exec 运行 rake 命令的主要区别是什么?
我看到很少有帖子指出,当您使用 bundle exec 运行命令时,它将在 gem 文件中定义的 gems 版本的范围内运行。如果是这种情况,那么应该强制使用 bundle exec 运行 rake 命令?
【问题讨论】:
标签: ruby-on-rails ruby rake bundle
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-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。
【讨论】:
如果您在 rails 中的任何命令之前使用bundle exec,它将在应用程序主文件夹中搜索我们的 Gemfile 中提到的 Gems。
假设,您有 2 个应用程序,并为每个应用程序使用不同的 ruby 版本。
如果没有 bundle exec,该命令可能无法运行,因为它可能需要不同版本的 Gem 来运行该任务。但是如果你开始使用bundle exec,它将需要确切的gem版本来运行任务/应用程序。
I recommend you to use **bundle exec** before any command.
【讨论】:
BUNDLE_GEMFILE=/path/to/gemfile bundle exec 可用于任何命令之前(如果未指定BUNDLE_GEMFILE,它将搜索文件系统并使用它找到的第一个),而不仅仅是rake。
您运行的任何命令都可能调用可执行的 Ruby 命令(例如 rake)或需要来自 Ruby 库的代码(例如 Rake::Task 类),这些东西通常由 gems 提供。 gem env 告诉您 gem 提供的库和可执行文件在哪里。但是,如果您使用 bundle exec,它会将可用的 gem 限制为与您的 bundle exec 上下文正在使用的 Gemfile 关联的 Gemfile.lock 文件中指定的那些。
使用您机器上所有可用的 gem(如果您不使用 bundle exec 可能会发生这种情况)可能是不可取的,原因如下:
这是一种快速查看差异的方法。
gem install thinfoo,其中包含两个文件:一个空 Gemfile 和一个文件 foo.rb,其内容为:#! /usr/bin/ruby (or whatever the path to your system Ruby is)require 'thin'
foo.rb 可执行。thin 和 ./foo.rb 都可以,但在前面加上 bundle exec 将不起作用。【讨论】: