【问题标题】:List of installed gems?已安装的宝石列表?
【发布时间】:2011-07-07 20:25:41
【问题描述】:

有没有我可以调用的 Ruby 方法来获取已安装 gem 的列表?

我想解析gem list 的输出。有没有其他方法可以做到这一点?

【问题讨论】:

    标签: ruby rubygems


    【解决方案1】:

    也许您可以从 gems 目录中获取文件(gems)?

    gemsdir = "gems directory"
    gems = Dir.new(gemsdir).entries
    

    【讨论】:

      【解决方案2】:

      Gem 命令现在包含在 Ruby 1.9+ 中,并且是 Ruby pre-1.9 的标准补充。

      require 'rubygems'
      
      name = /^/i
      dep = Gem::Dependency.new(name, Gem::Requirement.default)
      specs = Gem.source_index.search(dep)
      puts specs[0..5].map{ |s| "#{s.name} #{s.version}" }
      # >> Platform 0.4.0
      # >> abstract 1.0.0
      # >> actionmailer 3.0.5
      # >> actionpack 3.0.5
      # >> activemodel 3.0.5
      # >> activerecord 3.0.5
      

      这是获取列表的更新方法:

      require 'rubygems'
      
      def local_gems
         Gem::Specification.sort_by{ |g| [g.name.downcase, g.version] }.group_by{ |g| g.name }
      end
      

      因为local_gems 依赖于group_by,所以它返回gem 的哈希值,其中key 是gem 的名称,value 是gem 规格的数组。该值是已安装的 gem 实例的数组,按版本号排序。

      这样就可以执行以下操作:

      my_local_gems = local_gems()
      
      my_local_gems['actionmailer']
      # => [Gem::Specification.new do |s|
      #       s.authors = ["David Heinemeier Hansson"]
      #       s.date = Time.utc(2013, 12, 3)
      #       s.dependencies = [Gem::Dependency.new("actionpack",
      #         Gem::Requirement.new(["= 4.0.2"]),
      #         :runtime),
      #        Gem::Dependency.new("mail",
      #         Gem::Requirement.new(["~> 2.5.4"]),
      #         :runtime)]
      #       s.description = "Email on Rails. Compose, deliver, receive, and test emails using the familiar controller/view pattern. First-class support for multipart email and attachments."
      #       s.email = "david@loudthinking.com"
      #       s.homepage = "http://www.rubyonrails.org"
      #       s.licenses = ["MIT"]
      #       s.name = "actionmailer"
      #       s.require_paths = ["lib"]
      #       s.required_ruby_version = Gem::Requirement.new([">= 1.9.3"])
      #       s.requirements = ["none"]
      #       s.rubygems_version = "2.0.14"
      #       s.specification_version = 4
      #       s.summary = "Email composition, delivery, and receiving framework (part of Rails)."
      #       s.version = Gem::Version.new("4.0.2")
      #       end]
      

      还有:

      puts my_local_gems.map{ |name, specs| 
        [ 
          name,
          specs.map{ |spec| spec.version.to_s }.join(',')
        ].join(' ') 
      }
      # >> actionmailer 4.0.2
      ...
      # >> arel 4.0.1,5.0.0
      ...
      # >> ZenTest 4.9.5
      # >> zucker 13.1
      

      最后一个示例类似于gem query --local 命令行,只有您可以访问特定 gem 规范的所有信息。

      【讨论】:

      • 应该注意,“Dependency.new w/ a regexp is deprecated”。
      【解决方案3】:
      Gem::Specification.map {|a| a.name}
      

      但是,如果您的应用使用 Bundler,它将仅返回 依赖 本地 gem 的列表。全部安装:

      def all_installed_gems
         Gem::Specification.all = nil    
         all = Gem::Specification.map{|a| a.name}  
         Gem::Specification.reset
         all
      end
      

      【讨论】:

      • 这给了NoMethodError: undefined method any?'对于 nil:NilClass` 当我使用它时(在 rails console 中)。
      【解决方案4】:

      这列出了我已安装的所有 gem。

      gem query --local
      

      http://guides.rubygems.org/command-reference/#gem-list

      参见 2.7 列出所有已安装的 gems

      【讨论】:

      • 当我查看赞成票时,这个答案就是 大多数 人想要的。 :)
      • 问题本身有更好的答案gem list
      • gem list 完全符合我的要求,并且在 CLI 上调用起来更简单、更容易。为什么要做这么多命令来做一件事?
      • a)gem list、b)gem query 和 c)gem query --local 之间的区别。这三个似乎都有相同的行号。
      【解决方案5】:

      更现代的版本是使用类似于以下内容的东西......

      require 'rubygems'
      puts Gem::Specification.all().map{|g| [g.name, g.version.to_s].join('-') }
      

      注意:与 Evgeny 回答的第一部分非常相似......但由于页面格式,很容易错过。

      【讨论】:

        【解决方案6】:

        在终端试试:

        ruby -S gem list --local
        

        【讨论】:

        • 请注意,OP 想要一个 Ruby 方法
        【解决方案7】:

        多年来一直有一种方法:

        ruby -e 'puts Gem::Specification.all_names'
        

        【讨论】:

        • ruby -e 'puts Gem::Specification.all_names' 给我 "-e:1: uninitialized constant Gem (NameError)" 我该如何解决这个问题?
        【解决方案8】:

        两者

        gem query --local
        

         ruby -S gem list --local
        

        列出 69 个条目

        虽然

        ruby -e 'puts Gem::Specification.all_names'
        

        给我 82

        我使用wc -l 来获取数字。不确定这是否是正确的检查方法。尝试将输出重定向到文本文件并进行比较,但这没有帮助 - 需要手动一一比较。

        【讨论】:

        • 原因很简单。第一个命令只为每个 gem 添加一个条目,并在同一行的括号中列出版本。最后一个ruby 命令在单独的行上列出了每个gem 版本。例如:sass (3.3.14, 3.3.7, 3.3.6, 3.2.19)sass-3.3.14sass-3.3.7sass-3.3.6sass-3.2.19
        【解决方案9】:

        在您的调试器中输入 $LOAD_PATH 以获取您的 gem 列表。如果您没有调试器,请安装 pry:

        gem install pry
        pry
        Pry(main)> $LOAD_PATH
        

        这将输出一个已安装 gem 的数组。

        【讨论】:

          【解决方案10】:

          这是一个非常好的单行字,用于打印所有 Gems 及其版本、主页和描述:

          Gem::Specification.sort{|a,b| a.name <=> b.name}.map {|a| puts "#{a.name} (#{a.version})"; puts "-" * 50; puts a.homepage; puts a.description; puts "\n\n"};nil
          

          【讨论】:

            【解决方案11】:

            使用此代码(在控制台模式下):

            Gem::Specification.all_names
            

            【讨论】:

            • 你能改进你的答案吗?
            • 改进或让我知道您在我的回答中到底不喜欢什么
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多