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

age*_*217 77 rake ruby-on-rails bundler

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

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

jer*_*son 120

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.

  • 如果你厌倦了一直输入bundle exec,你可以配置rvm所以没有必要:http://ruby.railstutorial.org/chapters/static-pages#sec:eliminating_bundle_exec (4认同)
  • 使用 `bundle exec` 的一个很好的副作用是它还会告诉你是否应该运行 `bundle install` 来安装与 Gemfile.lock 文件相比你缺少的 gems 版本。 (2认同)

7st*_*tud 5

$ bundle exec rake db:migrate
使用Gemfile中指定的rake版本来执行rake任务db:migrate.

但是在Gemfile中没有指定rake gem!
是的,但是rake gem被安装为一些其他gem的依赖 - 看看Gemfile.lock.因此规则必须是:使用Gemfile.lock中指定的rake版本.

但是Gemfile.lock没有指定特定版本 - 它指定的版本大于xy!
然后规则必须是:使用当前gemset中安装的rake版本.

$ rake db:migrate
通常,当您在命令行上发出命令(例如rake)时,系统会在PATH环境变量中指定的目录列表中搜索该命令.包含该命令的第一个目录是使用的命令的版本.要查看哪个目录,您可以执行以下操作:

$ which rake
Run Code Online (Sandbox Code Playgroud)

所以,如果你执行,

$ rake db:migrate
Run Code Online (Sandbox Code Playgroud)

可能会使用不同的宝石耙比你安装了一个bundle install.但是,即使您的系统找到相同的rake版本bundle exec,也会在项目的gemset之外的位置搜索rake源代码所需的任何gem.因此,有很多方法可以:

$ rake db:migrate
Run Code Online (Sandbox Code Playgroud)

可以搞砸了.

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