使用 bundle exec rake 还是只使用 rake?

Posted

技术标签:

【中文标题】使用 bundle exec rake 还是只使用 rake?【英文标题】:Use bundle exec rake or just rake? 【发布时间】:2012-01-06 17:37:01 【问题描述】:

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

我应该使用bundle exec rake 而不是简单的rake 还是只是一种偏好?任何见解将不胜感激!谢谢!

【问题讨论】:

【参考方案1】:

$ 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:迁移 通常,当您在命令行上发出命令时,例如rake,您的系统会在 PATH 环境变量中指定的目录列表中搜索该命令。包含命令的第一个目录是使用的命令的版本。要查看是哪个目录,您可以执行以下操作:

$ which rake

所以如果你执行,

$ rake db:migrate

可能使用与您使用bundle install 安装的不同的 rake gem。但是,即使您的系统找到与 bundle exec 相同的 rake 版本,rake 源代码所需的任何 gem 都将在项目 gemset 之外的地方搜索。因此,有很多方法可以做到:

$ rake db:migrate

可以搞砸了。

根据 Ruby on Rails Tutorial Book(免费在线)第 3.6 节,如果您使用的是 rvm 1.11.x+,那么您不需要在命令前加上 bundle exec

【讨论】:

【参考方案2】:

在没有bundle exec 的情况下运行任何可执行文件将使 Rubygems 获取系统中安装的最新版本的 gem。

通过添加 bundle exec 前缀,可执行文件将在 Gemfile.lock 的上下文中运行,这意味着它将使用 gem 文件中定义的版本运行。

【讨论】:

【参考方案3】:

bundle exec 在你的包的上下文中执行一个命令。

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

使用bundle exec 可以保证程序在gemfile 中指定的环境下运行,这有希望意味着它是程序的创建者希望它运行的环境,这意味着它应该无论如何都应该正确运行你的电脑有什么奇怪的设置。

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

请参阅http://bundler.io/v1.3/man/bundle-exec.1.html 了解更多信息。

【讨论】:

如果您厌倦了一直键入 bundle exec,您可以配置 rvm,这样就没有必要了:ruby.railstutorial.org/chapters/… 注意:Bundle 手册页已更改,截至此日期正确的是:bundler.io/v1.3/man/bundle-exec.1.html 使用bundle exec 的一个很好的副作用是,它还会告诉您是否应该运行bundle install 来安装与Gemfile.lock 文件相比缺少的gem 版本。跨度> 你解释得很好..谢谢。

以上是关于使用 bundle exec rake 还是只使用 rake?的主要内容,如果未能解决你的问题,请参考以下文章

bundle exec rake 是啥意思?

在 bundle exec rake assets:precompile 后 OpsWorks 部署失败

Rails--bundle exec rake db:migrate

$ bundle exec rake db:reset 命令提升无法删除 db/development.sqlite3

Github 操作工作流 PG::ConnectionBad:无法连接到服务器:运行 bundle exec rake 时没有这样的文件或目录

gitlab迁移版本不一致问题