2013-07-09 3 views
2

Я работаю над написанием драгоценного камня, который имеет несколько зависимостей от драгоценных камней, один из которых зависит от драгоценного камня, который сломал назад совместимость в более новой версии. Это заставило меня задуматься - я не хочу, чтобы камень, который я создаю, стал «этим камнем», что затрудняет людям обновление их приложения. Я также не хочу заставлять людей, использующих мой драгоценный камень, использовать конкретные версии драгоценных камней, на которых это зависит, в остальной части их приложения.Есть ли способ упаковать все драгоценные камни моего драгоценного камня зависит от моего драгоценного камня?

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

+0

может создать мета-камень, который зависит точно от всех различных версий зависимостей суб-драгоценных камней, которые работают вместе? – rogerdpack

ответ

1

Я не думаю, что вы хотите, используя существующие инструменты Ruby. Однако, если обратная совместимость для вас, когда вы полагаетесь на свою зависимость, является исключительно проблемой синтаксиса/использования, а не разницей низкого уровня между версиями, тогда вам не нужно импортировать и поддерживать код старого драгоценного камня. У вас есть еще один вариант: создайте слой «прокладки» в своем драгоценном камне, который предоставляет функции, которые вам нужны, из нового или старого интерфейса зависимости.

На практике это может выглядеть следующим образом, предполагая, что в качестве примера, что это был конструктор к Thingy классу, который изменился:

module DependencyShim 

    def new_Thingy(new_style_args) 
    if thingy_is_new 
     Thingy.new(new_style_args) 
    else 
     Thingy.new(convert_args_to_old_style(new_style_args)) 
    end 
    end 

    # convert_args_to_old_style() not shown 

    private 

    def thingy_is_old 
    Thingy::VERSION < '1.3.4' 
    end 

    def thingy_is_new 
    Thingy::VERSION >= '1.3.4' 
    end 
end 

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

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

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

+0

Спасибо! Похоже, это самый лучший ответ на проблему на данный момент. – brightball

0

Предполагая, что вы используете Bundler, вы можете указать версии для зависимостей в вашем Gemfile так:

gem "my_dependency", "0.6.1" 

Там целая нагрузка других вариантов тоже, таких как «версия больше, чем X» и т.д. Читайте bundler docs для получения дополнительной информации.

+0

Я думаю, что OP это знает и ищет, что делать, когда версия '1.0.1' несовместима с их опубликованным камнем. И в идеале решить все так, что конечные пользователи могут использовать версию '1.0.1' в * проекте пользователя рядом с камнем, который не хочет версии' 1.0.1'. AFAIK, это либо невозможно, либо довольно сложно достичь. –

+0

Но вся идея ошибочна - он говорит: «Я также не хочу заставлять людей, использующих мой драгоценный камень, использовать конкретные версии драгоценных камней, на которых это зависит, в остальной части их приложения», что не так, они бы просто нужно иметь эти версии _installed_ для использования его драгоценного камня. – omnikron

+0

Я ошибаюсь, думая, что Gemfile.lock управляет зависимостями Gem во всем приложении и что, если мой Gem требует старую версию Nokogiri, это будет ограничивать все приложение для использования этой версии Nokogiri? Это всегда было моим пониманием того, как работает работа Gem. – brightball

Смежные вопросы