我应该如何在Ruby gem中管理特定于平台的代码?

我应该如何在Ruby gem中管理特定于平台的代码?,ruby,rubygems,cross-platform,code-organization,Ruby,Rubygems,Cross Platform,Code Organization,我正在编写一个gem,它将有一个特定于平台(OSX、Windows和Linux)的部分,以及一个独立于平台的部分。每个特定于平台的部分可能还依赖于其他特定于平台的gem 我不太清楚该如何组织 我是否应该为独立于平台的部分编写一个共享gem,然后为特定于平台的部分编写三个gem,并将共享gem指定为每个部分的依赖项 或者有没有一种聪明的方法可以使用平台在我的gemspec中设置(特定于平台的)依赖项 或者完全是别的什么?这听起来像是一个逃避现实的答案,但它确实取决于创业板及其内部结构。我想说,在您

我正在编写一个gem,它将有一个特定于平台(OSX、Windows和Linux)的部分,以及一个独立于平台的部分。每个特定于平台的部分可能还依赖于其他特定于平台的gem

我不太清楚该如何组织

我是否应该为独立于平台的部分编写一个共享gem,然后为特定于平台的部分编写三个gem,并将共享gem指定为每个部分的依赖项

或者有没有一种聪明的方法可以使用平台在我的gemspec中设置(特定于平台的)依赖项


或者完全是别的什么?

这听起来像是一个逃避现实的答案,但它确实取决于创业板及其内部结构。我想说,在您的主
require
文件中,有一个逻辑需要基于平台的gem的特定于平台的文件,这将是非常有意义的。例如:

# a user requires your library
require 'that_awesome_gem'

# in your gem's lib/that_awesome_gem.rb
if PLATFORM.os_x? # or whatever
  require 'that_awesome_gem/os_x/module1'
  require 'that_awesome_gem/os_x/module2'
elsif PLATFORM.win?
  require 'that_awesome_gem/win/module1'
  require 'that_awesome_gem/win/module2'
end
您还可以允许用户通过require语句指定所需的版本

# lib/that_awesome_gem/os_x.rb
PLATFORM.set_manual(:os_x)
require 'that_awesome_gem'

# lib/that_awesome_gem/win.rb
PLATFORM.set_manual(:win)
require 'that_awesome_gem'

# in the user's app
require 'that_awesome_gem/os_x'

(注意:显然,在你的应用程序中定义一个全局常数不是一个好主意,但是你得到了一个大致的想法:)

你可以为每个平台创建不同的gem。您还可以使用主文件中的
case
语句创建单个平台,为每个平台执行唯一的操作。以下是通过对照正则表达式检查平台名称来匹配操作系统的文件包含示例:

def require_files(os)
  files[os].each { |file| require file }
end

case RUBY_PLATFORM
  when /win32/
    require_files :win32
  when /linux/
    require_files :linux
  # and so on...
end

当然,这可以推广到任何多平台任务。

指定您的gem将从本地构建的gem本地安装。 减少依赖的最好方法是打乒乓球。 gem中应该有一个配置选项来强制执行此操作。 尚未检查以确认是否存在此类情况


Gem::Specification.new
标记最后一段代码是一个常见的误解,因为它在构建Gem时执行if语句,而不是在安装Gem时执行。因此,根据构建gem的平台,您将获得不同的运行时依赖关系!