我应该使用`bundle exec`还是Rails'binstubs?

时间:2017-06-22 00:41:37

标签: ruby-on-rails bundler

假设我有一个安装了bundler宝石的Rails应用程序。我应该使用bundle exec rails还是bin/rails?我应该使用bundle exec rake还是bin/rake?有什么区别吗?那些比其他任何一个好吗?

3 个答案:

答案 0 :(得分:2)

tl; dr 没什么特别的区别,但是如果我选择的话,我会使用bin/rails

几乎没有差异。让我们看看。

DISABLE_SPRING=1 bin/rails --version

bin/railsrequire_relative '../config/boot'
config/bootrequire 'bundler/setup'
bundler/setupBundler.setup
Bundler.setupdefinition.validate_runtime!
Bundler.definitionDefinition.build
Bundler::Definition.buildDsl.evaluate
Bundler::Dsl.evaluatebuilder.eval_gemfile
Bundler::Dsl#eval_gemfileinstance_eval

require 'bundler/setup'之后,尝试gem 'rails', 'x.y.z'会导致:

  

*** Gem :: LoadError异常:无法激活rails(= x.y.z),已经激活rails-5.1.3。确保所有依赖项都已添加到Gemfile。

有了bundle exec rails --version,我们无论如何都会运行bin/rails

~/.gem/ruby/x.y.z/bin/railsload Gem.activate_bin_path('railties', 'rails', version)
exe/railsrequire 'rails/cli'
rails/cliRails::AppLoader.exec_app
Rails::AppLoader.exec_app`exec RUBY, 'bin/rails', *ARGV

此外,请注意在last file中可以找到的消息:

  

从Rails 4开始,Rails附带了位于./bin/rails的rails垃圾桶,而不是由Bundler生成的rails垃圾桶。

因此,一天结束时没有任何区别。但是考虑到Rails难以运送自己的垃圾桶这一事实,我赞成使用bin/rails替代方案。而且,它的自动完成效果更好。

然后

  

App可执行文件现在位于bin/目录中:bin/bundlebin/railsbin/rake。运行rake rails:update:bin将这些可执行文件添加到您自己的应用程序中。 script/rails已从新应用中消失。

     

在应用程序内运行可执行文件可确保它们使用应用程序的Ruby版本及其捆绑的gem,并确保您的生产部署工具仅需要执行一个脚本。不再需要仔细cd到应用程序目录并运行bundle exec ...

     

捆绑器1.3并未将bin/视为生成的“ binstub”的垃圾抽屉,而是增加了对仅为您实际使用的可执行文件生成存根的支持:bundle binstubs unicorn生成bin/unicorn。将该可执行文件添加到git中,并像其他任何应用程序代码一样对其进行版本控制。

https://github.com/rails/rails/blob/4-0-stable/railties/CHANGELOG.md

答案 1 :(得分:0)

Bundle exec是一个Bundler命令。

你应该在所有情况下使用bundle exec

  

bundle-exec - 在bundle

的上下文中执行命令

可以在此处找到更多信息:http://bundler.io/v1.15/bundle_exec.html

bin / rails可能有效但仅当系统中存在所有必需的gem /可执行文件而没有bundle的范围时。

简而言之,如果您的系统上安装了所有宝石(例如全局),则bin / rails将起作用(但可能会产生冲突)。但是,如果您只在捆绑包的范围内安装它们,它们可能无法正常工作。

bundle exec确保使用Gemfile中的gem及其版本。

答案 2 :(得分:0)

bundle exec 只是确保在运行命令时安装 Gemfile 中的所有 gem(全局或用户空间或项目的 vendor/bundle 目录中)。在 https://bundler.io/man/bundle-exec.1.html(特别是 https://bundler.io/man/bundle-exec.1.html#BUNDLE-INSTALL-BINSTUBS 部分)中有更详细的解释:

<块引用>

捆绑安装 --binstubs

如果您在 --binstubs 中使用 bundle install 标志,Bundler 将自动创建一个目录(默认为 app_root/bin),其中包含可从包中的 gem 获得的所有可执行文件。

使用 --binstubs 后,bin/rspec spec/my_spec.rb 等同于 bundle exec rspec spec/my_spec.rb

Binstubs 还可能包含其他自定义设置,例如加载 spring gem,它可以预加载并加速 Rails 应用程序。