How do I find out all the dependencies of a gem?

前端 未结 2 1891
野趣味
野趣味 2021-01-06 08:45

I have been trying to find out dependencies for a ruby-gem. I know that gem dependency command will let me know about the dependencies of the gem. But I want to do more than

2条回答
  •  礼貌的吻别
    2021-01-06 09:50

    following class will recursively get gem dependencies (note its proof of concept so it does not do anything fancy, but its a good starting point). for documentation please refer rubydocs: Gem::Dependency and Gem::Specification

    class GemRequirements
      def initialize(name, version = nil)
        @gem = Gem::Dependency.new(name, version)
      end
    
      def dependency_tree
        @dependency_tree ||= {}.merge(get_dependency(@gem))
      end
    
      private
    
      def get_dependency(gem_dependency)
        spec = gem_dependency.matching_specs.first
        dep_key = "#{gem_dependency.name} #{spec.version}"
        hash = { dep_key => {} }
        spec.runtime_dependencies.each do |spec_dependency|
          spec_dependency_spec = spec_dependency.matching_specs.first
          spec_dep_key = "#{spec_dependency.name} #{spec_dependency_spec.version}"
          hash[dep_key][spec_dep_key] = get_dependency(spec_dependency)
        end
        hash
      end
    end
    

    you can use it programatically in your app or from ruby console:

    r = GemRequirements.new 'rails'
    r.dependency_tree  
    => {"rails 3.2.12"=>
      {"activesupport 3.2.12"=>
        {"activesupport 3.2.12"=>
          {"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
           "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
       "actionpack 3.2.12"=>
        {"actionpack 3.2.12"=>
          {"activesupport 3.2.12"=>
            {"activesupport 3.2.12"=>
              {"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
               "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
           "activemodel 3.2.12"=>
            {"activemodel 3.2.12"=>
              {"activesupport 3.2.12"=>
                {"activesupport 3.2.12"=>
                  {"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
                   "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
               "builder 3.0.4"=>{"builder 3.0.4"=>{}}}},
           "rack-cache 1.2"=>
            {"rack-cache 1.2"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
           "builder 3.0.4"=>{"builder 3.0.4"=>{}},
           "rack 1.4.5"=>{"rack 1.4.5"=>{}},
           "rack-test 0.6.2"=>
            {"rack-test 0.6.2"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
           "journey 1.0.4"=>{"journey 1.0.4"=>{}},
           "sprockets 2.2.2"=>
            {"sprockets 2.2.2"=>
              {"hike 1.2.1"=>{"hike 1.2.1"=>{}},
               "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}},
               "rack 1.4.5"=>{"rack 1.4.5"=>{}},
               "tilt 1.4.1"=>{"tilt 1.4.1"=>{}}}},
           "erubis 2.7.0"=>{"erubis 2.7.0"=>{}}}},
       "activerecord 3.2.12"=>
        {"activerecord 3.2.12"=>
          {"activesupport 3.2.12"=>
            {"activesupport 3.2.12"=>
              {"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
               "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
           "activemodel 3.2.12"=>
            {"activemodel 3.2.12"=>
              {"activesupport 3.2.12"=>
                {"activesupport 3.2.12"=>
                  {"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
                   "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
               "builder 3.0.4"=>{"builder 3.0.4"=>{}}}},
           "arel 3.0.2"=>{"arel 3.0.2"=>{}},
           "tzinfo 0.3.37"=>{"tzinfo 0.3.37"=>{}}}},
       "activeresource 3.2.12"=>
        {"activeresource 3.2.12"=>
          {"activesupport 3.2.12"=>
            {"activesupport 3.2.12"=>
              {"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
               "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
           "activemodel 3.2.12"=>
            {"activemodel 3.2.12"=>
              {"activesupport 3.2.12"=>
                {"activesupport 3.2.12"=>
                  {"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
                   "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
               "builder 3.0.4"=>{"builder 3.0.4"=>{}}}}}},
       "actionmailer 3.2.12"=>
        {"actionmailer 3.2.12"=>
          {"actionpack 3.2.12"=>
            {"actionpack 3.2.12"=>
              {"activesupport 3.2.12"=>
                {"activesupport 3.2.12"=>
                  {"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
                   "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
               "activemodel 3.2.12"=>
                {"activemodel 3.2.12"=>
                  {"activesupport 3.2.12"=>
                    {"activesupport 3.2.12"=>
                      {"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
                       "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
                   "builder 3.0.4"=>{"builder 3.0.4"=>{}}}},
               "rack-cache 1.2"=>
                {"rack-cache 1.2"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
               "builder 3.0.4"=>{"builder 3.0.4"=>{}},
               "rack 1.4.5"=>{"rack 1.4.5"=>{}},
               "rack-test 0.6.2"=>
                {"rack-test 0.6.2"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
               "journey 1.0.4"=>{"journey 1.0.4"=>{}},
               "sprockets 2.2.2"=>
                {"sprockets 2.2.2"=>
                  {"hike 1.2.1"=>{"hike 1.2.1"=>{}},
                   "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}},
                   "rack 1.4.5"=>{"rack 1.4.5"=>{}},
                   "tilt 1.4.1"=>{"tilt 1.4.1"=>{}}}},
               "erubis 2.7.0"=>{"erubis 2.7.0"=>{}}}},
           "mail 2.4.4"=>
            {"mail 2.4.4"=>
              {"mime-types 1.21"=>{"mime-types 1.21"=>{}},
               "treetop 1.4.12"=>
                {"treetop 1.4.12"=>{"polyglot 0.3.3"=>{"polyglot 0.3.3"=>{}}}},
               "i18n 0.6.4"=>{"i18n 0.6.4"=>{}}}}}},
       "railties 3.2.12"=>
        {"railties 3.2.12"=>
          {"rake 10.1.0"=>{"rake 10.1.0"=>{}},
           "rack-ssl 1.3.3"=>
            {"rack-ssl 1.3.3"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
           "thor 0.18.1"=>{"thor 0.18.1"=>{}},
           "rdoc 3.12.2"=>{"rdoc 3.12.2"=>{"json 1.8.1"=>{"json 1.8.1"=>{}}}},
           "activesupport 3.2.12"=>
            {"activesupport 3.2.12"=>
              {"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
               "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
           "actionpack 3.2.12"=>
            {"actionpack 3.2.12"=>
              {"activesupport 3.2.12"=>
                {"activesupport 3.2.12"=>
                  {"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
                   "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
               "activemodel 3.2.12"=>
                {"activemodel 3.2.12"=>
                  {"activesupport 3.2.12"=>
                    {"activesupport 3.2.12"=>
                      {"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
                       "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
                   "builder 3.0.4"=>{"builder 3.0.4"=>{}}}},
               "rack-cache 1.2"=>
                {"rack-cache 1.2"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
               "builder 3.0.4"=>{"builder 3.0.4"=>{}},
               "rack 1.4.5"=>{"rack 1.4.5"=>{}},
               "rack-test 0.6.2"=>
                {"rack-test 0.6.2"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
               "journey 1.0.4"=>{"journey 1.0.4"=>{}},
               "sprockets 2.2.2"=>
                {"sprockets 2.2.2"=>
                  {"hike 1.2.1"=>{"hike 1.2.1"=>{}},
                   "multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}},
                   "rack 1.4.5"=>{"rack 1.4.5"=>{}},
                   "tilt 1.4.1"=>{"tilt 1.4.1"=>{}}}},
               "erubis 2.7.0"=>{"erubis 2.7.0"=>{}}}}}},
       "bundler 1.3.5"=>{"bundler 1.3.5"=>{}}}}
    

提交回复
热议问题