假设我有一个安装了bundler
宝石的Rails应用程序。我应该使用bundle exec rails
还是bin/rails
?我应该使用bundle exec rake
还是bin/rake
?有什么区别吗?那些比其他任何一个好吗?
答案 0 :(得分:2)
tl; dr 没什么特别的区别,但是如果我选择的话,我会使用bin/rails
几乎没有差异。让我们看看。
DISABLE_SPRING=1 bin/rails --version
:
bin/rails
:require_relative '../config/boot'
config/boot
:require 'bundler/setup'
bundler/setup
:Bundler.setup
Bundler.setup
:definition.validate_runtime!
Bundler.definition
:Definition.build
Bundler::Definition.build
:Dsl.evaluate
Bundler::Dsl.evaluate
:builder.eval_gemfile
Bundler::Dsl#eval_gemfile
:instance_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/rails
:load Gem.activate_bin_path('railties', 'rails', version)
exe/rails
:require 'rails/cli'
rails/cli
:Rails::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/bundle
,bin/rails
,bin/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
中使用 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 应用程序。