我学习了Rails,只使用了像rake db:migrate
这样的rake命令;然而,我读到我应该使用bundle exec rake ...
而不是简单的rake
。现在我对使用哪一个感到困惑。使用bundle exec rake或只是耙?
我应该使用bundle exec rake
而不是简单的rake
还是只是一个偏好的事情?任何有识之士将非常感谢!谢谢!
我学习了Rails,只使用了像rake db:migrate
这样的rake命令;然而,我读到我应该使用bundle exec rake ...
而不是简单的rake
。现在我对使用哪一个感到困惑。使用bundle exec rake或只是耙?
我应该使用bundle exec rake
而不是简单的rake
还是只是一个偏好的事情?任何有识之士将非常感谢!谢谢!
bundle exec
在您的包的上下文中执行命令。
这意味着它使用Gemfile中指定的宝石。大多数情况下,运行bundle exec rake foo
与运行rake foo
的结果相同,尤其是如果您在系统范围内安装了与Gemfile中相同的gem。但是,某些应用程序可能会指定与系统范围内安装的不同版本的宝石,并且可能希望那些精确的宝石和版本能够正确运行。如果你只运行没有bundle exec
,你可能会得到一些奇怪的错误。
使用bundle exec
可以保证程序在gemfile中指定的环境下运行,希望这意味着它是程序创建者希望它运行的环境,希望这意味着它无论如何都能正确运行奇怪的设置你在你的电脑上。
它基本上标准化程序运行的环境。这有助于避免版本问题,让生活变得更轻松。
运行任何exacutable而没有bundle exec
将使Rubygems获取安装在系统中的最新版本的gem。
通过添加bundle exec
前缀代替将在Gemfile.lock的上下文中运行可执行文件,这意味着将使用gem文件中定义的版本运行该可执行文件。
$捆绑高管耙分贝:迁移
使用在指定的Gemfile执行rake任务db:migrate
耙的版本。
但是在Gemfile中没有指定耙宝石!
是的,但一个耙宝石被安装作为一些其他宝石的依赖 - 看看Gemfile.lock。所以规则必须是:使用在Gemfile.lock中指定的rake版本。
但是Gemfile.lock没有指定特定版本 - 它指定了一个大于x.y的版本!
然后,规则必须是:使用安装在当前gemset中的rake版本。
$耙分贝:迁移
通常,当你在命令行上发出命令,例如rake,系统会在您的PATH环境变量中指定的目录列表中搜索命令。包含该命令的第一个目录是所用命令的版本。要查看哪些目录,你可以这样做:
$ which rake
所以,如果你执行,
$ rake db:migrate
是可以使用不同的宝石耙比你bundle install
安装了一个。但是,即使您的系统发现与bundle exec
相同的rake版本,也会在您项目的gemset之外的地方搜索rake源代码所需的任何宝石。因此,有很多方法只是:
$ rake db:migrate
可以搞砸了。
根据Ruby on Rails教程手册(免费在线),第3.6节,如果您使用的是rvm 1.11.x +,那么您不需要在bundle exec
前面添加命令。
不错,谢谢 –
如果您厌倦了随时键入bundle exec,则可以配置rvm,因此它不是必需的:http://ruby.railstutorial.org/chapters/static-pages#sec:eliminating_bundle_exec –
注意:Bundle手册页更改,截至此日期正确的是:http://bundler.io/v1.3/man/bundle-exec.1.html –
使用'bundle exec'的一个很好的副作用是它也会告诉你如果您应该运行'bundle install'来安装与Gemfile.lock文件相比缺少的宝石版本。 –