我只使用了rake命令就学会了Rails rake db:migrate
;但是,我读到我应该使用bundle exec rake ...
而不是plain rake
。现在我对使用哪个感到困惑。
我应该使用bundle exec rake
而不是简单使用rake
还是仅仅是偏爱?任何见解将不胜感激!谢谢!
我只使用了rake命令就学会了Rails rake db:migrate
;但是,我读到我应该使用bundle exec rake ...
而不是plain rake
。现在我对使用哪个感到困惑。
我应该使用bundle exec rake
而不是简单使用rake
还是仅仅是偏爱?任何见解将不胜感激!谢谢!
Answers:
bundle exec
在包的上下文中执行命令。
这意味着它将使用您的Gemfile中指定的gem。在大多数情况下,运行bundle exec rake foo
与刚运行时具有相同的结果rake foo
,尤其是如果您在系统范围内安装了与Gemfile中相同的gem。但是,某些应用程序可能指定的gem版本与您在系统范围内安装的gem版本不同,并且可能希望这些确切的gem和版本能够正确运行。如果不使用bundle exec
,可能会出现一些奇怪的错误。
使用bundle exec
保证程序可以在gemfile中指定的环境下运行,这意味着它是程序创建者希望在其中运行的环境,这意味着无论您使用什么奇怪的设置,它都应该正确运行。你的电脑。
它从根本上标准化了程序运行的环境。这有助于避免版本地狱,并使生活更加轻松。
bundle exec
是,它还会告诉您是否应该运行bundle install
以安装与Gemfile.lock文件相比丢失的gem版本。
$ bundle exec rake db:migrate
使用Gemfile中指定的rake版本执行rake任务db:migrate
。
但是在Gemfile中没有指定rake gem!
是的,但安装了rake gem作为其他gem的依赖项-在Gemfile.lock中查找。因此,规则必须是:使用Gemfile.lock中指定的rake版本。
但是Gemfile.lock没有指定特定版本,而是指定了大于xy的版本!
然后,规则必须为:使用当前gemset中安装的rake的版本。
$ rake db:migrate
通常,当您在命令行上发出命令(例如rake)时,系统会在PATH环境变量中指定的目录列表中搜索该命令。包含该命令的第一个目录是所使用命令的版本。要查看哪个目录,可以执行以下操作:
$ which rake
所以如果执行
$ rake db:migrate
这可能会使用不同的宝石耙比你安装了一个bundle install
。但是,即使您的系统找到与相同的rake版本bundle exec
,也将在项目的gemset之外的位置搜索rake源代码所需的任何gem。因此,有很多方法可以实现:
$ rake db:migrate
会搞砸
根据Ruby on Rails教程手册(免费在线)的第3.6节,如果您使用的是rvm 1.11.x +,则无需在命令前加上bundle exec
。