为什么 `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
)。
这就是 rails
和 bundle exec rails
不一样的原因。
这不是错误,不应修复该行为。是的,您不必 运行 bundle exec rails
因为在最近的版本中,rails
做完全相同的事情。但是您看到的错误是另一个问题。
尽管有这样的答案: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
)。
这就是 rails
和 bundle exec rails
不一样的原因。
这不是错误,不应修复该行为。是的,您不必 运行 bundle exec rails
因为在最近的版本中,rails
做完全相同的事情。但是您看到的错误是另一个问题。