为什么 `bundle exec rails s` 与 `rails s` 不同?

Why is `bundle exec rails s` not the same as `rails s`?

尽管有这样的答案:rails s or bundle exec rails s

以及像这样的博文:https://www.wyeworks.com/blog/2011/12/27/bundle-exec-rails-executes-bundler-setup-3-times/

这一切似乎都表明你应该简单地 运行 rails s 而不是 bundle exec rails s 我仍然发现偶尔我不能简单地 运行 rails s .例如

$ rails s
Rails is not currently installed on this system. To get the latest version, simply type:

$ sudo gem install rails

You can then rerun your "rails" command. 

而 运行随后在同一环境中立即执行此操作:

$ bundle exec rails s
=> Booting WEBrick
=> Rails 4.0.0.beta1 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2015-01-28 12:31:48] INFO  WEBrick 1.3.1
[2015-01-28 12:31:48] INFO  ruby 2.0.0 (2014-11-13) [x86_64-darwin14.0.0]
[2015-01-28 12:31:48] INFO  WEBrick::HTTPServer#start: pid=18959 port=3000

为什么不一样?是否应该修复此行为?如果是,如何修复?

====更新

回应@awendt

$ which rails
/Users/snowcrash/.rvm/gems/ruby-2.0.0-p598/bin/rails
$ rails c
Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.
$ bundle exec rails c
Loading development environment (Rails 4.0.0.beta1)
2.0.0-p598 :001 > 

对于 Rails 3x 及更高版本,只要您是 运行 和 rails server,它总是在您的 environment 上下文 中] 和你的 Gemfile。所以 bundler 在这方面帮助启动和加载 需要的 gems/libraries 使用 $BUNDLE_PATH 启动应用程序如果您不使用 bundle exec,默认情况下不会存在,它仅包含使用 gemset 的默认 libraries/gems(如果您使用 rvm)或默认加载路径。

..希望这有帮助

试图重现这个,我得到(在 Ubuntu 12.04.5 LTS):

me@machine:/some/path$ rails c
The program 'rails' is currently not installed.  To run 'rails' please ask your administrator to install the package 'rails'
me@machine:/some/path$ which rails
me@machine:/some/path$

因此,就我而言,rails 脚本不在我的 $PATH 中。

您的设置不同,因为消息明确提到了 gem。你甚至可能会得到这个:

you@machine:/some/path$ which rails
/usr/bin/rails
you@machine:/some/path$

因为 /usr/bin/ 位于您的 $PATH 某处,并且 you're still invoking the rails script that ships with the OS.

无论如何,重要的部分是:bundle exec rails c 让 Bundler 找出在哪里可以找到 Rails gem,而不是让 shell搞清楚。

您可以将 gem 安装到一个完全任意的位置,只有 Bundler 才能找到它们,因为该位置不在您的 $PATH 中,而是在您的$BUNDLE_PATH(参见 list of available keys for bundle config)。

这就是 railsbundle exec rails 不一样的原因。

这不是错误,不应修复该行为。是的,您不必 运行 bundle exec rails 因为在最近的版本中,rails 做完全相同的事情。但是您看到的错误是另一个问题。