Bundle exec rake是什么意思?

你。 提交于 2020-03-02 17:07:19

bundle exec rake db:migrate是什么意思? 还是一般只bundle exec rake <command>

我知道bundle负责维护Gemfile中的内容。 我知道“ exec”一词的含义。 我了解到rake保留了您可以执行的所有不同脚本操作,并且我知道db:migrate是其中之一。 我只是不知道所有这些词在一起是做什么的。 为什么应使用bundle执行rake来执行数据库迁移?


#1楼

我没有太多使用bundle exec ,但是现在进行设置。

我曾经遇到过使用错误的耙子的情况,而浪费大量时间来查找问题。 这可以帮助您避免这种情况。

设置RVM的方法如下,默认情况下,您可以在特定项目目录中使用bundle exec

https://thoughtbot.com/blog/use-bundlers-binstubs


#2楼

您正在程序上运行bundle exec 。 该程序的创建者在某些版本的宝石可用时就编写了该程序。 程序Gemfile指定创建者决定使用的gem的版本。 也就是说,脚本已针对这些gem版本正确运行。

您系统范围的Gemfile可能与此Gemfile不同。 您可能拥有较新或较旧的gem,但此脚本无法很好地发挥作用。 版本上的这种差异可能会给您带来怪异的错误。

bundle exec可以帮助您避免这些错误。 它使用脚本的Gemfile(而不是系统范围的Gemfile)中指定的gem执行脚本。 它使用Shell别名的魔术来执行某些gem版本。

有关更多信息,请参见手册页

这是一个示例Gemfile:

source 'http://rubygems.org'

gem 'rails', '2.8.3'

在这里, bundle exec将使用2.8.3的Rails版本执行脚本,而不是在系统范围内安装的其他版本。


#3楼

可能应该提到的是,有一些方法可以省略bundle exec (它们全部在Michael Hartls Ruby on Rails教程的 3.6.1章中进行了说明)。

最简单的方法是仅使用最新版本的RVM(> = 1.11.x)。

如果限于RVM的早期版本,则可以始终使用calasyr也提到的这种方法:

$ rvm get head && rvm reload
$ chmod +x $rvm_path/hooks/after_cd_bundler
$ bundle install --binstubs=./bundler_stubs

然后,还将bundler_stubs目录添加到.gitignore文件中。

第三种选择是,如果您不使用RVM,则使用rubygems-bundler gem:

$ gem install rubygems-bundler
$ gem regenerate_binstubs

#4楼

当您的gemfile.lock在计算机上安装了不同版本的gem时,就会出现很多问题。 运行rake(或rspec或其他)后,您可能会收到警告:

You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.

前面的bundle exec告诉捆绑程序执行此命令,而不考虑版本差异。 并不总是有问题,但是,您可能会遇到问题。

幸运的是,有一个宝石可以解决这个问题:rubygems-bundler。

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

然后再尝试使用rake,rspec或其他方法。


#5楼

当您直接运行rake任务或执行gem的任何二进制文件时,无法保证该命令的行为符合预期。 因为可能已经在系统上安装了相同的gem,版本为1.0,但在项目中却具有较高的版本,例如2.0。 在这种情况下,您无法预测将使用哪一个。

要强制执行所需的gem版本,请使用bundle exec命令的帮助,该命令将在当前bundle的上下文中执行二进制文件。 这意味着,当您使用bundle exec时,bundler会检查为当前项目配置的gem版本,并使用它来执行任务。

我也写了一篇关于它的文章 ,它也显示了如何避免使用bin存根使用它。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!