Ruby gem 与可执行文件的可选运行时依赖性

Optional runtime dependency for Ruby gem with executables

我正在写一个 gem aipp 公开了一些可执行文件,这里没什么特别的:

#!/usr/bin/env ruby
require 'aipp'
AIPP::NOTAM::Executable.new(File.basename([=12=])).run

部分 gem 可选择使用数据库适配器(pg 或 ruby-mysql gem)。但是由于在云上使用 gem 时这些可能会很麻烦,所以我真的想让它们成为可选的并且不需要它们作为 .gemspec.[=19 中的运行时依赖项=]

所以我在运行时有条件地要求它们:

require 'pg' if ENV['AIPP_POSTGRESQL_URL']
require 'mysql' if ENV['AIPP_MYSQL_URL']

不幸的是,这没有按预期工作。当设置了任何一个环境变量并使用了可执行文件时,require 失败——可能是因为没有声明依赖关系。

我试过在可执行文件上使用内联 Gemfile,如下所示。在开发中工作(回购结帐),但在通过 Rubygems 安装 gem 时不工作:

#!/usr/bin/env ruby
require 'bundler/inline'
gemfile do
  source 'https://rubygems.org'
  gem 'aipp'
  gem 'pg', '~> 1' if ENV['AIPP_POSTGRESQL_URL']
  gem 'ruby-mysql', '~> 3' if ENV['AIPP_MYSQL_URL']
end
AIPP::NOTAM::Executable.new(File.basename([=14=])).run

要求 gem 的正确方法是什么,这些 gem 未被列为运行时依赖项,但额外安装(通过 gem installGemfile)?

也许有人知道现有的 gem 已经以某种方式解决了这个问题。

感谢您的帮助!

我会用bundler groups

gemfile do
  source 'https://rubygems.org'
  gem 'aipp'
  group :database do
    gem 'pg', '~> 1'
    gem 'ruby-mysql'
  end
end

在 link 中有更多关于如何使用它们的信息。