1

我有一个带有 config.ru 和 Gemfile 的父机架应用程序,并且在 app/ 内尝试安装多个 rails 和 sinatra 应用程序。每个挂载的应用程序都有自己的 Gemfile(因此它们可以独立开发)和自己的数据库(rake 任务可从每个挂载应用程序的根目录获得)。然后,我尝试从父根目录运行单个 unicorn 主进程,该进程读取父 config.ru,它加载到每个已安装的应用程序中。

我正在使用 rvm 和捆绑器。每个已安装的应用程序以及父应用程序都bundle install将 gem 安装到同一个 gemset 中。

所以,我遇到的问题是,当我bundle exec unicorn -c app/unicorn.conf -E development从父机架应用程序的根目录运行时,我收到有关已安装应用程序的 Gemfile 中所需的某些 gem 的错误对父级的 Gemfile 不可用。(例如,无法加载导轨)。

根据我的阅读和猜测,bundler 只会加载一个 Gemfile(在这种情况下,是父应用程序根目录下的那个)。我已经看到了在 I 时评估较低目录中的其他 Gemfile 的黑客行为bundle install,但是当 Gemfile 中的相同 gem 都被动态写入父级的 Gemfile 时,这通常会中断。

当我尝试在没有的情况下运行 unicorn 时bundle exec,这似乎可以在一台机器上运行,但不能在其他机器上运行。我猜这是因为 gem 二进制文件没有锁定到特定 Gemfile 中列出的那些。我想知道它是否仅在当前 rvm 环境中加载 gem,从而使特定 gemset 的所有 gem 可用(在这种情况下这是理想的),或者它可能使其他可用的 gem 全局可用。对此的任何澄清都会有所帮助。

我的问题是,如果我想从父机架应用程序启动独角兽,我是否必须在父机架应用程序 Gemfile 中列出已安装应用程序的 Gemfile 中使用的所有宝石?或者我应该在每个已挂载的应用程序的 config.ru/application.rb 文件中进行某种额外的配置bundler/setup ; Bundler.require(:default),例如分配一个新的 Gemfile ( ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__))?

第一种方法似乎很痛苦,因为我必须随时更改 2 个 Gemfile。但是我无法使用第二种方法。

还是有一些关于独立开发多个机架应用程序并尝试将它们全部安装在我没有看到的单个机架中的基础知识?

4

1 回答 1

0

对于单独Gemfile的 s,您需要先清洁环境:

Bundler.with_clean_env do
  ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
  require 'bundler/setup'
  Bundler.require(:default)
end

您可能还需要卸载以前加载的 gem 以防止使用我的gembundler-unload使用错误的 gem 版本,例如参见https://github.com/mpapis/rubygems-bundler/blob/master/lib/rubygems-bundler/noexec.rb

于 2013-11-12T05:38:59.433 回答