【问题标题】:How to combine gems from multiple Gemfiles to run one Ruby program?如何组合来自多个 Gemfile 的 gem 来运行一个 Ruby 程序?
【发布时间】:2012-07-18 13:39:24
【问题描述】:

我的问题

假设我有这样的目录结构:

app/
    core/
        bin/
            runner
        Gemfile
        ...
    Gemfile
    lib/

“核心”是一个拥有自己的 Gemfile 和 Gemfile.lock 的应用程序。我不想以任何方式修改核心。 app/Gemfile 是我的核心插件的一部分,它也有一个 Gemfile(列出它自己的依赖项,这些依赖项是 core/Gemfile 之外的)。

我可以从 app/core/ 和 app/ 目录“捆绑安装”。

如何从 app/ 目录运行 core/bin/runner 以使其包含 app/core/Gemfile 和 app/Gemfile 中的所有 Ruby gem?

背景

我正在使用 C Ruby 为 Logstash 编写插件。 Logstash 包含自己的 Gemfile;获取所有依赖项后,总包大小约为 40MB。

我想在 Heroku 中运行 Logstash。为了避免将 40MB 的东西放入 Git,我已经分叉了 Ruby buildpack (https://github.com/inscitiv/heroku-buildpack-logstash) 并对其进行了修改以下载 Logstash、解压并使用它的 Gemfile。

这很好用,但我被 Logstash 提供的 Gemfile 卡住了。对于我的插件,我想添加我的插件将使用的新依赖项;我真的不想分叉 Logstash 并更改其 Gemfile 来完成此操作。

相反,我想将 Logstash 解压到它自己的目录 (logstash/) 中,然后我想在它上面覆盖我的插件代码,包括用于依赖项的 Gemfile。然后我想运行一个 Heroku“worker”进程,它将运行 logstash,指定“。”作为插件目录,并且可以访问两个 Gemfile 中的所有 gem。

【问题讨论】:

    标签: ruby heroku rubygems bundler logstash


    【解决方案1】:

    答案是顶层 Gemfile 应该包含子目录 Gemfiles。

    类似这样的东西(来自 Redmine 2.0 Gemfile)

    # Load plugins' Gemfiles
    Dir.glob File.expand_path("../plugins/*/Gemfile", __FILE__) do |file|
      puts "Loading #{file} ..." if $DEBUG # `ruby -d` or `bundle -v`
      instance_eval File.read(file)
    end
    

    【讨论】:

      【解决方案2】:

      要让 bundler 正确处理所有 gem 依赖项,它确实需要将它们全部放在一个文件中。你能把你的插件变成一个 gem 并让你的部署例程将一个 gem 添加到父 Gemfile 吗?然后,您自己的 gem 可以列出将合并到整体中的依赖项。

      【讨论】:

      • 一个问题是 Heroku 要求 Gemfile.lock 存在并且是最新的。所以我必须分叉 Logstash 并更新 Gemfile 和 Gemfile.lock;我试图避免。
      • 这就是 Bundler 和 Gemfiles 的重点——它在开发时甚至在进入源代码控制之前将依赖关系树锁定在一起。然后在部署时,它会安装完全相同的环境。这样做的唯一方法是顶级 Gemfile.lock 必须事先列出所有依赖项。在我看来,您正试图在飞机飞行时在飞机上安装新门。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2021-05-18
      • 2016-03-21
      相关资源
      最近更新 更多