我的问题
假设我有一个像这样的目录结构:
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中的所有宝石。
答案 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可以列出可以合并到整体中的依赖项。