如何结合多个Gemfiles中的gem来运行一个Ruby程序?

时间:2012-07-18 13:39:25

标签: ruby heroku rubygems bundler logstash

我的问题

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

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

“核心”是一个具有自己的Gemfile和Gemfile.lock的应用程序。我不想以任何方式修改核心。 app / Gemfile是我的核心插件的一部分,它还有一个Gemfile(列出了自己的核心/ Gemfile附加的依赖项)。

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

如何从app /目录运行core / bin / runner,以便包含app / core / Gemfile和app / Gemfile中的所有Ruby gems?

背景

我正在使用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,指定“。”作为插件目录,并且可以访问两个Gemfiles中的所有宝石。

2 个答案:

答案 0 :(得分:2)

答案是顶级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

答案 1 :(得分:1)

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