【问题标题】:What is the difference between "rails s" and "bundle exec rails s"?“rails s”和“bundle exec rails s”有什么区别?
【发布时间】:2014-07-13 19:58:42
【问题描述】:

rails sbundle exec rails s 有什么区别?人们似乎说bundle exec rails s 更好,但为什么呢?同时this postrails s 更好。

这是什么?

【问题讨论】:

标签: ruby-on-rails ruby bundler


【解决方案1】:

有时,当您安装 gem 时,它也会附带一个可执行文件/二进制文件。这些示例包括:railsrakerspecpry 等。但是,当您有多个版本时安装 gem 之后,您将拥有这些可执行文件的多个版本。因此,如果您想为给定的 rails 应用程序执行这些二进制文件之一,您可能需要明确您想要的可执行文件——例如,用于 rake v10.1 的可执行文件或用于 rake v10.2 的可执行文件。由于这个问题的答案可以通过 Gemfile.lock 文件(由 bu​​ndler 创建)中的 gem 版本来发现,bundler 提供了一个命令来执行基于当前项目的 Gemfile 中指定的版本的二进制文件。锁。这个命令是bundle exec <command>

因此,对于大多数命令,您需要运行 bundle exec <command> 以确保您正在为您的项目运行正确的版本(并确保所有依赖项也从 Gemfile 中指定的正确版本加载。锁)。该规则的一个臭名昭著的例外是rails 命令。原因是rails 命令所做的第一件事是加载捆绑程序并检查要执行的命令版本。因此,在运行 rails 命令时,您实际上只是在放慢自己的速度,首先涉及到 bundler。

所以,简而言之,使用:

rails server
rails console
bundle exec <some command that isn't rails>

【讨论】:

  • 感谢您的回答,来自您的报价,rails command does is load up bundler and check which version of the command to execute。它是如何检查的?是否也使用 gemfile.lock?
  • @Kit Ho,是的。 Gemfile.lock 指定了 rails 的版本,并且由于 Rails 对 rails 应用程序至关重要,rails 命令自省为您做正确的事情。另一方面,Rake 不是 100% 特定于轨道的,因此它不会尝试自省。
【解决方案2】:

http://bundler.io/v1.5/rails3.html - Rails 3 自带捆绑器支持烘焙

【讨论】:

  • 您能详细说明一下吗?它会触发错误版本的 rails 吗?
【解决方案3】:

bundle exec 确保您从 Gemfile 中的 gem 触发命令。

对于rails 命令可能没有那么有用,但对于rake 来说绝对是必需的。

【讨论】:

  • 你的意思是如果我只使用rails s,我可能会触发Gemfile中没有说明的另一个rails?
  • 对于 rails 是的,所以 bundle exec 不会伤害 rails 但也没有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 2021-02-26
相关资源
最近更新 更多