使用和不使用bundle exec运行rake命令之间的区别

时间:2013-05-10 07:30:13

标签: ruby-on-rails ruby rake bundle

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

我看到很少发帖说明当你用bundle exec运行命令时,它将在gem文件中定义的gems版本的范围内运行。如果是这种情况,则必须使用bundle exec运行rake命令?

4 个答案:

答案 0 :(得分:3)

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

你没有明确提到Rails,但我发现你的帖子被标记为Rails,所以这个实际上的人为的示例可能如下:

由于某些正当理由,您的系统上安装了虚构的whateva-whateva gem版本2.0。

您决定要从某个位置下载旧的Rails项目以将其检出并在克隆项目的根文件夹中运行bundle install。该命令将安装Rails应用程序所需的所有gem,其中一个恰好是虚构的whateva-whateva gem的verison 1.0。

所以当前状态是这样的:您的旧rails应用程序有一个gem包,其中包含whateva-whateva的旧版本,而您的系统范围内的gem包含whateva-whateva gem的更新版本。

当您运行与Rails应用程序关联的rake任务时,您想要加载哪个版本?当然是较老的。

为了做到这一点,你可以使用bundle exec rake the:task并在你的bundle的上下文中运行rake命令 - 旧版本的gem加上旧rails应用程序的Gemfile中指定的其他东西。< / p>

所以是的,我认为可以说最好的做法是你应该总是先bundle exec但是说实话我很懒,很少去做,除非我看到问题。

在其他新闻中,如果你使用Bundler的binstubs,你不需要添加它。以下是设置该链接的链接:http://robots.thoughtbot.com/post/15346721484/use-bundlers-binstubs

答案 1 :(得分:1)

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

您运行的任何命令都可能调用可执行的Ruby命令(例如rake)或需要Ruby库中的代码(例如Rake::Task类),这些东西通常由gem提供。 gem env告诉您gem提供的库和可执行文件的位置。但是,如果您使用bundle exec,则会将可用的Gems限制为与您的Gemfile.lock上下文使用的Gemfile相关联的bundle exec文件中指定的内容。

使用您机器上的所有可用宝石(如果您不执行bundle exec可能会发生这种情况)可能是不受欢迎的,原因如下:

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

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

  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之前运行将不起作用。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

bundle-exec - 在bundle

的上下文中执行命令

此命令执行命令,使得Gemfile(5)中指定的所有gem在Ruby程序中都可用。

它不适用于唯一的rake,而是适用于rails,rspec,rackup命令。

基本上,如果你经常运行像rspec spec / my_spec.rb这样的东西,并且想要使用Gemfile(5)中指定的gems并通过bundle install(1)安装,你应该运行bundle exec rspec spec /my_spec.rb。

请注意,bundle exec不要求shell的$ PATH上有可执行文件。

有关详细信息,请查看bundle exec doc。