Требовать зависимость только от определенного вызова метода - PullRequest
1 голос
/ 01 марта 2012

У меня есть библиотека функций, которая упакована как драгоценный камень.Одна из этих функций требует использования стороннего гема, который сам имеет длинный список зависимостей.

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

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

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Вы можете разделить свои функции на модули (возможно, модули на файлы тоже), которые зависят или не зависят от гема.включая модуль GemDependent, пытающийся потребовать ваш драгоценный камень, если нет, то переопределите все зависящие от драгоценного камня функции, чтобы вызвать исключение.

module YourFunctions
  module GemDependent

    def self.included(klass)
      require "yourgem"
    rescue LoadError
      instance_methods.each do |m|
        define_method(m) { raise "you need yourgem to run #{m}" }
      end
    end

    def gem_dependent_function
    end
  end

  include GemDependent

  def no_dependent_function
  end
end

include YourFunctions
gem_dependent_function
#  "you need yourgem to run gem_dependent_function"
0 голосов
/ 02 марта 2012

Если вы хотите узнать, как это сделать, взгляните на различные библиотеки-оболочки для http, json, yaml и т. Д.

хорошим примером является https://github.com/rubiii/httpi, где вы можете настроить один из 3 http-адаптеров. сами адаптеры требуют индивидуальных зависимостей в Ruby.

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

...