Managing conflicting versions of ruby gems

后端 未结 2 1562
醉梦人生
醉梦人生 2021-01-21 14:05

I am building a framework that loads user provided ruby code. It is basically a plugin mechanism. I want the user provide ruby code to be able to require gems of its own. I i

相关标签:
2条回答
  • 2021-01-21 14:57

    To be blunt, you can't have two versions of the same gem loaded at the same time.

    Bundler does a good (ish) job of looking through all of the required gems and finding a solution to the various overlapping dependencies, but even so it is limited to only loading one version of a gem at a time.

    This leads to plugin developers constantly having to update to support any changes that are made in dependent gems in order to avoid just the situation you describe.

    (Don't get me started on the screw up that results from the various competing JSON implementations and the pain you have to go through when you have several gem dependencies all requiring different ones.)

    0 讨论(0)
  • 2021-01-21 15:06

    Respectfully disagree with the answer above. Here is how I do it:

    ruby -S gem list my_gem

    `*** LOCAL GEMS ***
    my_gem (1.0.1, 1.0.0, 0.0.2)
    `
    

    ruby -S gem lock my_gem-1.0.0 > locklist.rb

    which generates list of dependencies for a specific version into locklist

    require 'rubygems'
    gem 'my_gem', '= 1.0.0'
    gem 'gem_base', '= 1.0.0'
    gem 'rest-client', '= 1.7.2'
    gem 'savon', '= 1.1.0'
    gem 'addressable', '= 2.3.6'
    gem 'mime-types', '= 1.25.1'
    gem 'netrc', '= 0.11.0'
    

    now you can do load('locklist.rb') which will load a specific version of a gem along with its dependencies. Look ma, no Bundler.

    0 讨论(0)
提交回复
热议问题