Как мне управлять кодом конкретной платформы в моем Ruby gem? - PullRequest
1 голос
/ 14 марта 2011

Я пишу гем, который будет иметь специфическую для платформы часть (OSX, Windows и Linux), а также независимую от платформы часть. Каждый раздел, специфичный для платформы, вероятно, также будет зависеть от других драгоценных камней, специфичных для платформы.

Я не очень уверен, как это организовать.

Должен ли я написать общий драгоценный камень для независимой от платформы части, затем три драгоценных камня для отдельных частей платформы и указать общий драгоценный камень в качестве зависимости для каждой из них?

Или есть умный способ использовать платформу для установки (специфичных для платформы) зависимостей в моем gemspec?

Или что-то совсем другое?

Ответы [ 3 ]

1 голос
/ 14 марта 2011

Вы можете создавать различные драгоценные камни для каждой платформы. Вы также можете создать одну, которая выполняет уникальные операции для каждой платформы, используя оператор 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

Это, конечно, можно обобщить для любой многоплатформенной задачи.

1 голос
/ 14 марта 2011

Вероятно, это будет звучать как отговорка, но это действительно зависит от драгоценного камня и его внутренних предметов. Я бы сказал, что было бы неплохо иметь в своем основном файле require логику, которая требует специфичных для платформы файлов для вашего драгоценного камня на основе платформы. Например:

# 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'

(Примечание: очевидно, что определение глобальной константы в вашем приложении не очень хорошая идея, но вы получите общую идею.:)

0 голосов
/ 21 декабря 2013

Назначьте, что ваш камень должен быть установлен локально из локально построенного камня. Лучший способ уменьшить зависимость pecking-ping-pong. Должен быть параметр конфигурации в gem для этого. Не проверили, чтобы подтвердить наличие таких.

MarkT

...