4

使用和不使用 bundle exec 运行 rake 命令的主要区别是什么?

我看到很少有帖子说,当您使用 bundle exec 运行命令时,它将在 gem 文件中定义的 gems 版本的范围内运行。如果是这种情况,那么应该强制使用 rake 命令运行bundle exec

4

4 回答 4

3

bundle exec rake some:task在你的包的上下文中运行 rake 任务。

你没有明确提到 Rails,但我看到你的帖子被标记为 Rails,所以一个人为的例子可能如下:

whateva-whateva您出于某种正当理由在系统上安装 了虚拟 gem 的 2.0 版。

你决定要从某个地方拉下一个旧的 Rails 项目以检查它并bundle install在克隆项目的根文件夹中运行。该命令将安装 Rails 应用程序所需的所有 gem,其中一个恰好是虚拟whateva-whatevagem 的 1.0 版。

所以目前的状态是这样的:你的旧 Rails 应用程序有一个 gem 包,其中包含旧版本的whateva-whateva和你的系统范围的 gem 包括新版本的whateva-whatevagem。

当您运行与 Rails 应用程序相关的 rake 任务时,您希望加载哪个版本?当然是年纪大的。

为了做到这一点,你可以使用bundle exec rake the:task它并在你的包的上下文中运行 rake 命令——旧版本的 gem 加上旧 Rails 应用程序的 Gemfile 中指定的任何其他内容。

所以是的,毕竟,我认为可以肯定地说,最好的做法是你应该总是预先bundle exec准备,但老实说,我很懒惰,除非我发现问题,否则很少这样做。

在其他新闻中,如果您使用 Bundler 的 binstubs,则无需添加它。这是设置它的链接:https ://thoughtbot.com/blog/use-bundlers-binstubs

于 2013-05-10T08:26:38.677 回答
1

BUNDLE_GEMFILE=/path/to/gemfile bundle exec可用于任何命令之前(如果BUNDLE_GEMFILE未指定,则搜索文件系统并使用找到的第一个命令),而不仅仅是rake.

您运行的任何命令都可能调用可执行的 Ruby 命令(例如rake)或需要来自 Ruby 库(例如Rake::Task类)的代码,这些东西通常由 gems 提供。 gem env告诉您 gem 提供的库和可执行文件在哪里。但是,如果您使用bundle exec它将可用的 gem 限制为与您的上下文正在使用的Gemfile.lock文件关联的文件中指定的那些。Gemfilebundle exec

bundle exec出于以下几个原因,使用机器上所有可用的 gem(如果不这样做可能会发生)可能是不可取的:

  • 您的完整宝石套装中可能存在不兼容性。
  • 很难准确地说出您正在使用什么宝石,这给您的工作环境增加了一些不可预测性。

这是查看差异的快速方法。

  1. gem install thin
  2. 创建一个foo包含两个文件的目录:一个空 Gemfile 和一个foo.rb包含以下内容的文件:
    #! /usr/bin/ruby (or whatever the path to your system Ruby is)
    require 'thin'
  3. 使foo.rb可执行。
  4. 请注意,运行thin./foo.rb从命令行都可以工作,但在任何一个之前都bundle exec不起作用。
于 2013-05-10T08:42:18.287 回答
0

如果您bundle exec在 rails 中的任何命令之前使用,它将在应用程序主文件夹中搜索我们的 Gemfile 中提到的 Gems。

假设,您有 2 个应用程序,并为每个应用程序使用不同的 ruby​​ 版本。如果没有 bundle exec,该命令可能无法运行,因为它可能需要不同版本的 Gem 来运行该任务。但是如果您开始使用bundle exec它将需要确切的 gem 版本来运行任务/应用程序。

I recommend you to use **bundle exec** before any command.

于 2013-05-10T08:47:29.150 回答
0

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。

于 2014-04-28T14:29:25.210 回答