3

我的问题

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

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。

4

2 回答 2

3

答案是顶层 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
于 2012-09-06T16:55:12.647 回答
1

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

于 2012-07-18T13:44:31.537 回答