我只使用像rake db:migrate
这样的rake命令学习了Rails;但是,我读到我应该使用bundle exec rake ...
而不是普通rake
。现在我对使用哪个感到困惑。
我应该使用bundle exec rake
而不仅仅是普通的rake
还是仅仅是偏好的东西?任何见解都将非常感谢!谢谢!
答案 0 :(得分:117)
bundle exec
在您的捆绑包的上下文中执行命令。
这意味着它使用Gemfile中指定的gem。大多数情况下,运行bundle exec rake foo
的结果与刚刚运行rake foo
的结果相同,特别是如果您在系统范围内安装了与Gemfile中相同的gems。但是,某些应用程序可能会指定不同于您在系统范围内安装的宝石版本,并且可能希望这些精确的宝石和版本能够正确运行。如果你只是在没有bundle exec
的情况下运行,你可能会遇到一些奇怪的错误。
使用bundle exec
保证程序使用gemfile中指定的环境运行,这有望意味着它是程序创建者希望它运行的环境,这有望意味着它应该正确运行无论你的计算机上有什么奇怪的设置。
它基本上标准化了运行程序的环境。这有助于避免版本地狱,让生活更轻松。
答案 1 :(得分:5)
$ bundle exec rake db:migrate
使用Gemfile中指定的rake版本来执行rake任务db:migrate
。
但Gemfile中没有指定rake gem!
是的,但是rake gem被安装为一些其他gem的依赖 - 看看Gemfile.lock。因此规则必须是:使用Gemfile.lock中指定的rake版本。
但是Gemfile.lock没有指定特定版本 - 它指定的版本大于x.y!
然后规则必须是:使用当前gemset中安装的rake版本。
$ rake db:migrate
通常,在命令行上发出命令时,例如rake,您的系统在PATH环境变量中指定的目录列表中搜索命令。包含该命令的第一个目录是使用的命令的版本。要查看该目录,您可以执行以下操作:
$ which rake
所以,如果你执行,
$ rake db:migrate
可能使用与您使用bundle install
安装的rake gem不同的rake gem。但是,即使您的系统找到与bundle exec
相同的rake版本,也会在项目的gemset之外的位置搜索rake源代码所需的任何gem。因此,有很多方法可以:
$ rake db:migrate
可以搞砸了。
根据Ruby on Rails教程书(免费在线),第3.6节,如果您使用的是rvm 1.11.x +,那么您不需要使用bundle exec
作为序言。
答案 2 :(得分:1)
在没有bundle exec
的情况下运行任何exacutable将使Rubygems获取系统中安装的最新版本的gem。
通过添加bundle exec
前缀而不是在Gemfile.lock的上下文中运行可执行文件,这意味着将使用gem文件中定义的版本运行。