使用和不使用bundle exec运行rake命令之间的主要区别是什么?
我看到很少发帖说明当你用bundle exec运行命令时,它将在gem文件中定义的gems版本的范围内运行。如果是这种情况,则必须使用bundle exec
运行rake命令?
答案 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
可能会发生这种情况)可能是不受欢迎的,原因如下:
这是一种快速查看差异的方法。
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
之前运行将不起作用。答案 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。