【问题标题】:bundle vs npm approach or why does bundle/gem installs globally?bundle vs npm 方法或者为什么 bundle/gem 全局安装?
【发布时间】:2014-01-07 09:39:18
【问题描述】:

我对全局依赖的 Bundle/Gem 方法感到困惑。我认为全局依赖已成为过去。我向您介绍了两种处理依赖项的方法,NPM 与 Bundle/Gem。

NPM

让我来演示 NPM 的强大功能。假设您有一个具有以下文件夹结构的应用:

/app
  /admin
     package.json
  /front-end
     package.json

您可以看到,在我的应用程序中,我还有另外两个迷你应用程序。每个都有自己的package.json

假设他们都有q 作为要求,但有不同的版本。在这两个文件夹中运行npm install 会为每个小应用程序的node_modules 安装适当的版本。一切都很好地隔离并且运行良好。

捆绑包/宝石

Bundles 方法略有不同。您使用Gemfile 来指定您的依赖项。运行bundle install 后,gems 将被放入系统范围的位置。这意味着,如果我有一个应用程序需要在其迷你应用程序中使用不同版本的 gem,那么它将无法工作。

对我来说毫无意义的变通方法:

  • 我知道有一个bundle install --deployment,但它 仅用于生产中的部署。我的代码应该如何 从事开发工作?

  • 另外,我知道您可以选择要求特定的 代码中 gem 的版本,但这比 有Gemfile,里面有特定的版本。也没有意义 在生产环境中,因为您已经拥有bundle install --deployment

我 100% 确定我在这里遗漏了一些非常微不足道的东西。请为我指明正确的方向。

【问题讨论】:

    标签: rubygems gem bundle npm


    【解决方案1】:

    我找到了“答案”。

    Ruby 与 Node.js 不同,它没有对本地 node_modules 之类的实现的内置支持。因此,您必须使用 Bundler。但是要在代码中使用依赖项,您需要让 Ruby 知道这些依赖项的位置。 Bundler 在您的应用代码中使用以下几行代码让您更轻松:

    require 'rubygems'
    require 'bundler/setup'
    

    这将读取您的 Gemfile.lock 并在您需要来自应用程序的某些内容时应用正确的路径。这是我错过的部分。

    您还可以使用 bundle exec {rubygem} 运行由 bundler 为您的应用安装的 gem,而不是全局安装的 gem。

    我希望这对某人有帮助!

    【讨论】:

    • 如何设置 rvm 以使其正常工作?使用仅在本地安装的项目的 gem 设置新项目的工作流程是什么样的?
    • 如果你不想,你不必使用rvm。您需要在 Gemfile 中指定您的 gem,并使用 bundler 安装它们。
    【解决方案2】:

    如果您使用bundle install --binstubs path=vendor,那么您将获得本地(项目)安装的gem,而不是系统范围。 Bundler 仍然采用不同的方法来处理它需要但具有不同版本的库,方法是安装一个与两者兼容的库。

    【讨论】:

      猜你喜欢
      • 2018-11-30
      • 2013-08-25
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 2016-02-17
      相关资源
      最近更新 更多