使用捆绑执行耙或只是耙?

时间:2011-11-26 02:40:16

标签: ruby-on-rails rake bundler

我只使用像rake db:migrate这样的rake命令学习了Rails;但是,我读到我应该使用bundle exec rake ...而不是普通rake。现在我对使用哪个感到困惑。

我应该使用bundle exec rake而不仅仅是普通的rake还是仅仅是偏好的东西?任何见解都将非常感谢!谢谢!

3 个答案:

答案 0 :(得分:117)

bundle exec在您的捆绑包的上下文中执行命令。

这意味着它使用Gemfile中指定的gem。大多数情况下,运行bundle exec rake foo的结果与刚刚运行rake foo的结果相同,特别是如果您在系统范围内安装了与Gemfile中相同的gems。但是,某些应用程序可能会指定不同于您在系统范围内安装的宝石版本,并且可能希望这些精确的宝石和版本能够正确运行。如果你只是在没有bundle exec的情况下运行,你可能会遇到一些奇怪的错误。

使用bundle exec保证程序使用gemfile中指定的环境运行,这有望意味着它是程序创建者希望它运行的环境,这有望意味着它应该正确运行无论你的计算机上有什么奇怪的设置。

它基本上标准化了运行程序的环境。这有助于避免版本地狱,让生活更轻松。

有关详细信息,请参阅http://bundler.io/v1.3/man/bundle-exec.1.html

答案 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文件中定义的版本运行。