【问题标题】:difference between running rake command with and without bundle exec使用和不使用 bundle exec 运行 rake 命令之间的区别
【发布时间】:2013-05-04 20:13:18
【问题描述】:

使用和不使用 bundle exec 运行 rake 命令的主要区别是什么?

我看到很少有帖子指出,当您使用 bundle exec 运行命令时,它将在 gem 文件中定义的 gems 版本的范围内运行。如果是这种情况,那么应该强制使用 bundle exec 运行 rake 命令?

【问题讨论】:

    标签: ruby-on-rails ruby rake bundle


    【解决方案1】:

    bundle exec rake some:task 在你的包的上下文中运行 rake 任务。

    您没有明确提及 Rails,但我看到您发布的帖子带有 Rails 标记,因此人为的示例可能如下所示:

    出于某种正当理由,您的系统上安装了虚构的 whateva-whateva gem 的 2.0 版。

    您决定要从某个地方下载一个旧的 Rails 项目以检查它并在克隆项目的根文件夹中运行bundle install。该命令将安装 Rails 应用程序所需的所有 gem,其中一个恰好是虚构的 whateva-whateva gem 的 1.0 版。

    所以当前状态是这样的:您的旧 Rails 应用有一个 gem 包,其中包含旧版本的 whateva-whateva,而您的系统范围的 gem 包含一个较新版本的 whateva-whateva gem。

    当您运行与 Rails 应用相关的 rake 任务时,您希望加载哪个版本?当然是大一点的。

    为了做到这一点,您可以使用bundle exec rake the:task,它会在您的包的上下文中运行 rake 命令——旧版本的 gem 加上旧版 rails 应用程序的 Gemfile 中指定的任何其他内容。

    所以是的,毕竟,我认为可以肯定地说,最好的做法是你应该总是在前面加上bundle exec,但老实说,我很懒惰,除非我发现问题,否则很少这样做。

    在其他新闻中,如果您使用 Bundler 的 binstubs,则无需添加它。这是设置的链接:https://thoughtbot.com/blog/use-bundlers-binstubs

    【讨论】:

      【解决方案2】:

      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。

      【讨论】:

        【解决方案3】:

        如果您在 rails 中的任何命令之前使用bundle exec,它将在应用程序主文件夹中搜索我们的 Gemfile 中提到的 Gems。

        假设,您有 2 个应用程序,并为每个应用程序使用不同的 ruby​​ 版本。 如果没有 bundle exec,该命令可能无法运行,因为它可能需要不同版本的 Gem 来运行该任务。但是如果你开始使用bundle exec,它将需要确切的gem版本来运行任务/应用程序。

        I recommend you to use **bundle exec** before any command.

        【讨论】:

          【解决方案4】:

          BUNDLE_GEMFILE=/path/to/gemfile bundle exec 可用于任何命令之前(如果未指定BUNDLE_GEMFILE,它将搜索文件系统并使用它找到的第一个),而不仅仅是rake

          您运行的任何命令都可能调用可执行的 Ruby 命令(例如 rake)或需要来自 Ruby 库的代码(例如 Rake::Task 类),这些东西通常由 gems 提供。 gem env 告诉您 gem 提供的库和可执行文件在哪里。但是,如果您使用 bundle exec,它会将可用的 gem 限制为与您的 bundle exec 上下文正在使用的 Gemfile 关联的 Gemfile.lock 文件中指定的那些。

          使用您机器上所有可用的 gem(如果您不使用 bundle exec 可能会发生这种情况)可能是不可取的,原因如下:

          • 您的全套宝石可能不兼容。
          • 很难准确判断您使用的是什么宝石,这给您的工作环境增加了一些不可预测性。

          这是一种快速查看差异的方法。

          1. gem install thin
          2. 创建一个目录foo,其中包含两个文件:一个空 Gemfile 和一个文件 foo.rb,其内容为:
            #! /usr/bin/ruby (or whatever the path to your system Ruby is)
            require 'thin'
          3. 使foo.rb 可执行。
          4. 请注意,从命令行运行 thin./foo.rb 都可以,但在前面加上 bundle exec 将不起作用。

          【讨论】:

            猜你喜欢
            • 2015-05-25
            • 1970-01-01
            • 2012-01-06
            • 1970-01-01
            • 2014-07-01
            • 2021-08-18
            • 1970-01-01
            • 1970-01-01
            • 2013-09-29
            相关资源
            最近更新 更多