为什么`bundle exec rails s`与`rails s`不一样?

时间:2015-01-28 12:34:54

标签: ruby-on-rails bundler

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

以及类似的博文:http://blog.wyeworks.com/2011/12/27/bundle-exec-rails-executes-bundler-setup-3-times/

这似乎表明你应该只是运行rails s而不是bundle exec rails s我仍然发现偶尔我不能简单地运行rails s。 E.g。

$ 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 > 

2 个答案:

答案 0 :(得分:1)

尝试重现这一点,我得到(在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

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

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中(请参阅{{ 3}})。

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

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

答案 1 :(得分:0)

对于Rails 3x及更高版本,无论何时运行rails server,它始终位于environmentGemfile上下文中。因此,bundler有助于启动和加载必需的 gems /库,使用$BUNDLE_PATH来启动应用程序,如果您不使用{{1},默认情况下不会出现该应用程序相反,它只包含使用bundle exec的默认库/ gems(如果您使用gemset)或默认路径加载。

..希望这会有所帮助