Ruby on rails 使用和不使用bundle exec运行rake命令的区别
使用和不使用bundle exec运行rake命令的主要区别是什么Ruby on rails 使用和不使用bundle exec运行rake命令的区别,ruby-on-rails,ruby,rake,bundle,Ruby On Rails,Ruby,Rake,Bundle,使用和不使用bundle exec运行rake命令的主要区别是什么 我看到一些帖子说,当您使用bundle exec运行命令时,它将在gem文件中定义的gems版本的范围内运行。如果是这种情况,则必须使用bundle exec运行rake命令。bundle exec rake some:task在包的上下文中运行rake任务 您没有明确提到Rails,但我看到您的帖子被标记为Rails,因此一个做作的例子可能如下所示: 您的系统上安装了虚构的whateva whatevagem的2.0版,原因是
我看到一些帖子说,当您使用bundle exec运行命令时,它将在gem文件中定义的gems版本的范围内运行。如果是这种情况,则必须使用
bundle exec
运行rake命令。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:task,它在bundle的上下文中运行rake命令——旧版本的gem加上旧rails应用程序的gem文件中指定的任何其他内容
所以,是的,在所有这些之后,我认为可以肯定地说,最好的做法是,您应该总是预先编写bundle exec
,但老实说,我很懒,除非看到问题,否则很少这样做
在其他新闻中,如果您使用Bundler的binstubs,则不需要添加它。这里有一个设置的链接:
BUNDLE\u GEMFILE=/path/to/GEMFILE BUNDLE exec
可以用于任何命令之前(如果未指定BUNDLE\u GEMFILE
,它会搜索文件系统并使用它找到的第一个),而不仅仅是rake
您运行的任何命令都可能调用可执行的Ruby命令(例如rake
),或者需要Ruby库中的代码(例如rake::Task
类),这些东西通常由gems提供<代码>gem env告诉您gem提供的库和可执行文件在哪里。但是,如果使用bundle exec
,则会将可用的gem限制为与Gemfile
关联的Gemfile.lock
文件中指定的gem,而bundle exec
上下文正在使用
使用计算机上所有可用的gem(如果您不执行bundle exec
,可能会发生这种情况)可能是不可取的,原因如下:
- 您的完整gem集合中可能存在不兼容
- 很难准确地说出你在使用什么宝石,这给你的工作环境增加了一些不可预测性
gem安装精简版
foo
,其中包含两个文件:一个是空文件,另一个是包含以下内容的文件foo.rb
#/usr/bin/ruby(或任何指向系统ruby的路径)
要求“精简”
foo.rb
可执行thin
和/foo.rb
都可以,但是前面的bundle exec
都不起作用如果在rails中的任何命令之前使用
bundle exec
,它将在应用程序主文件夹中搜索GEM文件中提到的GEM
假设您有两个应用程序,每个应用程序使用不同的ruby版本。
如果没有bundle exec,该命令可能无法运行,因为运行该任务可能需要不同版本的Gem。但是如果您开始使用bundle exec
,则运行任务/应用程序将需要确切的gem版本
我建议您在任何命令之前使用**bundle exec**。
bundle exec-在bundle的上下文中执行命令
此命令执行该命令,使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上有可执行文件
有关更多详细信息,请查看文档