使用和不使用 bundle exec 运行 rake 命令的主要区别是什么?
我看到很少有帖子说,当您使用 bundle exec 运行命令时,它将在 gem 文件中定义的 gems 版本的范围内运行。如果是这种情况,那么应该强制使用 rake 命令运行bundle exec?
使用和不使用 bundle exec 运行 rake 命令的主要区别是什么?
我看到很少有帖子说,当您使用 bundle exec 运行命令时,它将在 gem 文件中定义的 gems 版本的范围内运行。如果是这种情况,那么应该强制使用 rake 命令运行bundle exec?
bundle exec rake some:task在你的包的上下文中运行 rake 任务。
你没有明确提到 Rails,但我看到你的帖子被标记为 Rails,所以一个人为的例子可能如下:
whateva-whateva您出于某种正当理由在系统上安装 了虚拟 gem 的 2.0 版。
你决定要从某个地方拉下一个旧的 Rails 项目以检查它并bundle install在克隆项目的根文件夹中运行。该命令将安装 Rails 应用程序所需的所有 gem,其中一个恰好是虚拟whateva-whatevagem 的 1.0 版。
所以目前的状态是这样的:你的旧 Rails 应用程序有一个 gem 包,其中包含旧版本的whateva-whateva和你的系统范围的 gem 包括新版本的whateva-whatevagem。
当您运行与 Rails 应用程序相关的 rake 任务时,您希望加载哪个版本?当然是年纪大的。
为了做到这一点,你可以使用bundle exec rake the:task它并在你的包的上下文中运行 rake 命令——旧版本的 gem 加上旧 Rails 应用程序的 Gemfile 中指定的任何其他内容。
所以是的,毕竟,我认为可以肯定地说,最好的做法是你应该总是预先bundle exec准备,但老实说,我很懒惰,除非我发现问题,否则很少这样做。
在其他新闻中,如果您使用 Bundler 的 binstubs,则无需添加它。这是设置它的链接:https ://thoughtbot.com/blog/use-bundlers-binstubs
BUNDLE_GEMFILE=/path/to/gemfile bundle exec可用于任何命令之前(如果BUNDLE_GEMFILE未指定,则搜索文件系统并使用找到的第一个命令),而不仅仅是rake.
您运行的任何命令都可能调用可执行的 Ruby 命令(例如rake)或需要来自 Ruby 库(例如Rake::Task类)的代码,这些东西通常由 gems 提供。 gem env告诉您 gem 提供的库和可执行文件在哪里。但是,如果您使用bundle exec它将可用的 gem 限制为与您的上下文正在使用的Gemfile.lock文件关联的文件中指定的那些。Gemfilebundle exec
bundle exec出于以下几个原因,使用机器上所有可用的 gem(如果不这样做可能会发生)可能是不可取的:
这是查看差异的快速方法。
gem install thinfoo包含两个文件的目录:一个空 Gemfile 和一个foo.rb包含以下内容的文件:#! /usr/bin/ruby (or whatever the path to your system Ruby is)require 'thin'foo.rb可执行。thin和./foo.rb从命令行都可以工作,但在任何一个之前都bundle exec不起作用。如果您bundle exec在 rails 中的任何命令之前使用,它将在应用程序主文件夹中搜索我们的 Gemfile 中提到的 Gems。
假设,您有 2 个应用程序,并为每个应用程序使用不同的 ruby 版本。如果没有 bundle exec,该命令可能无法运行,因为它可能需要不同版本的 Gem 来运行该任务。但是如果您开始使用bundle exec它将需要确切的 gem 版本来运行任务/应用程序。
I recommend you to use **bundle exec** before any command.
bundle-exec - 在包的上下文中执行命令
该命令执行该命令,使 Gemfile(5) 中指定的所有 gem 都可以在 Ruby 程序中使用。
它不是唯一的 rake,而是适用于 rails、rspec、rackup 命令。
本质上,如果您通常会运行 rspec spec/my_spec.rb 之类的东西,并且想要使用 Gemfile(5) 中指定并通过 bundle install(1) 安装的 gem,则应该运行 bundle exec rspec spec/my_spec。 rb。
请注意,bundle exec 不需要可执行文件在您的 shell 的 $PATH 上可用。
有关更多详细信息,请查看bundle exec doc。