我学会了使用就像rake命令Rails的rake db:migrate
; 但是,我读,我应该使用bundle exec rake ...
而不是只是普通的rake
。 现在我感到困惑的哪个。
我应该用bundle exec rake
,而不是只是简单的rake
或者是它只是一个偏好的事情吗? 任何有识之士将不胜感激! 谢谢!
我学会了使用就像rake命令Rails的rake db:migrate
; 但是,我读,我应该使用bundle exec rake ...
而不是只是普通的rake
。 现在我感到困惑的哪个。
我应该用bundle exec rake
,而不是只是简单的rake
或者是它只是一个偏好的事情吗? 任何有识之士将不胜感激! 谢谢!
bundle exec
在捆绑的上下文中执行的命令。
这意味着它使用在你的Gemfile中指定的宝石。 大部分的时间,运行bundle exec rake foo
具有相同的结果,如果你只是跑rake foo
,特别是如果你已经安装了全系统在你的Gemfile相同的宝石。 然而,一些应用程序可以指定不同的版本比宝石你已经安装了全系统的那些,并且可能需要那些确切的宝石和版本能够正常运行。 如果你只是不运行bundle exec
,你可能会得到一些奇怪的错误。
使用bundle exec
保证了节目与在Gemfile中,这有望意味着它是环境,该方案的创建者希望它在运行,这希望意味着它应该正常运行,无论指定的环境中运行什么奇怪的设置,您在您的计算机上。
它基本上规范下该程序运行环境。 这有助于避免版本地狱,让生活变得更轻松。
见http://bundler.io/v1.3/man/bundle-exec.1.html获取更多信息。
$捆绑EXEC耙分贝:迁移
使用在指定的Gemfile执行任务耙耙的版本db:migrate
。
但在Gemfile中没有指定耙宝石!
是的,但一耙宝石安装一些其他宝石的依赖 - 看在Gemfile.lock的。 因此,规则必须是:用于Gemfile.lock的规定耙的版本。
但Gemfile.lock的不指定特定的版本-它指定一个版本比XY越大!
那么该规则必须是:使用已安装在当前宝石耙的版本。
$耙分贝:迁移
通常,当你发出命令行命令,如耙,你的系统将搜索在PATH环境变量指定的目录列表中的命令。 包含命令的第一个目录是使用命令的版本。 要查看哪些目录,你可以这样做:
$ which rake
所以,如果你执行,
$ rake db:migrate
可使用不同的宝石耙比你安装了一个bundle install
。 但是,即使你的系统发现同一耙版本bundle exec
,由耙源代码所需的任何宝石将在项目的宝石以外的地方搜索。 因此,有很多方法,只是:
$ rake db:migrate
可以搞砸。
按照Ruby on Rails的教程书(网上),3.6节,如果你正在使用RVM 1.11.x +,那么你就不需要前面加上命令bundle exec
。
运行没有任何exacutable bundle exec
将有RubyGems的获取最新版本安装在系统中的宝石。
通过增加bundle exec
前缀,反而会在你的Gemfile.lock的,这意味着的背景下运行的可执行文件将使用宝石文件中定义的版本上运行。