【问题标题】:How to find where gem files are installed如何查找 gem 文件的安装位置
【发布时间】:2013-10-05 00:12:45
【问题描述】:

我可以找到使用 gem list 安装的 gem,但它没有显示 gem 的安装位置。

如何找到 gem 的位置,以及在安装 gem 之前如何知道它的安装位置?

【问题讨论】:

    标签: ruby rubygems


    【解决方案1】:

    使用gem environment 了解您的gem 环境:

    RubyGems Environment:
      - RUBYGEMS VERSION: 2.1.5
      - RUBY VERSION: 2.0.0 (2013-06-27 patchlevel 247) [x86_64-darwin12.4.0]
      - INSTALLATION DIRECTORY: /Users/ttm/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0
      - RUBY EXECUTABLE: /Users/ttm/.rbenv/versions/2.0.0-p247/bin/ruby
      - EXECUTABLE DIRECTORY: /Users/ttm/.rbenv/versions/2.0.0-p247/bin
      - SPEC CACHE DIRECTORY: /Users/ttm/.gem/specs
      - RUBYGEMS PLATFORMS:
        - ruby
        - x86_64-darwin-12
      - GEM PATHS:
         - /Users/ttm/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0
         - /Users/ttm/.gem/ruby/2.0.0
      - GEM CONFIGURATION:
         - :update_sources => true
         - :verbose => true
         - :backtrace => false
         - :bulk_threshold => 1000
      - REMOTE SOURCES:
         - https://rubygems.org/
      - SHELL PATH:
         - /Users/ttm/.rbenv/versions/2.0.0-p247/bin
         - /Users/ttm/.rbenv/libexec
         - /Users/ttm/.rbenv/plugins/ruby-build/bin
         - /Users/ttm/perl5/perlbrew/bin
         - /Users/ttm/perl5/perlbrew/perls/perl-5.18.1/bin
         - /Users/ttm/.pyenv/shims
         - /Users/ttm/.pyenv/bin
         - /Users/ttm/.rbenv/shims
         - /Users/ttm/.rbenv/bin
         - /Users/ttm/bin
         - /usr/local/mysql-5.6.12-osx10.7-x86_64/bin
         - /Users/ttm/libsmi/bin
         - /usr/local/bin
         - /usr/bin
         - /bin
         - /usr/sbin
         - /sbin
         - /usr/local/bin
    

    请注意以下两个部分:

    • INSTALLATION DIRECTORY
    • GEM PATHS

    【讨论】:

    • 感谢您的信息!在我的环境中,GEM PATHS 似乎只使用了第一个。对吗?
    • 简称gem env
    • 我会查看EXECUTABLE DIRECTORY
    • EXECUTABLE DIRECTORY 包含 gems 安装的 CLI 可执行版本,但不是 gems 本身。
    【解决方案2】:

    我发现获取库文件的位置很有用:

    gem which *gemname*
    

    【讨论】:

    • 这是一个非常好的简单方法,不需要捆绑器(虽然我确实喜欢捆绑器:-)。
    • 最简单的答案,不需要 rails 或 bundler!不错!
    • 我喜欢这个版本,因为它对进行 logstash 开发的人很有用(我的服务器上没有捆绑器)。示例很有用:gem which 'logstash/inputs/tcp.rb'
    • 这并不总是有效的。仅当您的 gem 作为 PATH 目录中的可执行文件存在时才有效。
    【解决方案3】:

    安装 gem 后,如果您想知道特定 gem 的位置。尝试输入:

     gem list
    

    您将能够看到已安装的 gem 列表。现在使用 bundle show 并命名您想知道其路径的 gem,如下所示:

     bundle show <gemName>
    

    或者(对于较年轻版本的 bundler):

     bundle info <gemName>
    

    【讨论】:

    • 我不确定这是否适用于所有目录。我运行了这个命令,得到了Could not locate Gemfile or .bundle/ directory
    • 这是最好的方法,因为它显示完整路径,(而gem env)仅显示gems 文件夹的父文件夹:/home/test/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0。它里面有许多文件夹,你的 gem 可能位于其中的几乎任何一个中 - 这正是 bundle show &lt;gemName&gt; 显示的内容(而 gem env 没有显示。
    • [已弃用] 使用 bundle info &lt;gemName&gt; 而不是 bundle show &lt;gemName&gt;
    【解决方案4】:

    要完成其他答案,gem-path gem 可以找到特定 gem 的安装路径。

    安装:

    gem install gem-path
    

    用法:

    gem path rails
    => /home/cbliard/.rvm/gems/ruby-2.1.5/gems/rails-4.0.13
    gem path rails '< 4'
    => /home/cbliard/.rvm/gems/ruby-2.1.5/gems/rails-3.2.21
    

    这真的很方便,因为您可以使用它来 grep 或编辑文件:

    grep -R 'Internal server error' "$(gem path thin)"
    subl "$(gem path thin)"
    

    【讨论】:

      【解决方案5】:

      您可以在命令提示符下运行gem help commands,然后选择正确的命令来检查它:

      kirti@kirti-Aspire-5733Z:~$  gem help commands
      GEM commands are:
      
          build                  Build a gem from a gemspec
          cert                   Manage RubyGems certificates and signing settings
          check                  Check a gem repository for added or missing files
          cleanup                Clean up old versions of installed gems in the local
                                 repository
          contents               Display the contents of the installed gems
          dependency             Show the dependencies of an installed gem
          environment            Display information about the RubyGems environment
          fetch                  Download a gem and place it in the current directory
          generate_index         Generates the index files for a gem server directory
          help                   Provide help on the 'gem' command
          install                Install a gem into the local repository
          list                   Display gems whose name starts with STRING
          lock                   Generate a lockdown list of gems
          mirror                 Mirror all gem files (requires rubygems-mirror)
          outdated               Display all gems that need updates
          owner                  Manage gem owners on RubyGems.org.
          pristine               Restores installed gems to pristine condition from
                                 files located in the gem cache
          push                   Push a gem up to RubyGems.org
          query                  Query gem information in local or remote repositories
          rdoc                   Generates RDoc for pre-installed gems
          regenerate_binstubs    Re run generation of executable wrappers for gems.
          search                 Display all gems whose name contains STRING
          server                 Documentation and gem repository HTTP server
          sources                Manage the sources and cache file RubyGems uses to
                                 search for gems
          specification          Display gem specification (in yaml)
          stale                  List gems along with access times
          uninstall              Uninstall gems from the local repository
          unpack                 Unpack an installed gem to the current directory
          update                 Update installed gems to the latest version
          which                  Find the location of a library file you can require
          yank                   Remove a specific gem version release from
                                 RubyGems.org
      
      For help on a particular command, use 'gem help COMMAND'.
      
      Commands may be abbreviated, so long as they are unambiguous.
      e.g. 'gem i rake' is short for 'gem install rake'.
      kirti@kirti-Aspire-5733Z:~$ 
      

      现在从上面我可以看到命令environment 很有帮助。所以我会这样做:

      kirti@kirti-Aspire-5733Z:~$ gem help environment
      Usage: gem environment [arg] [options]
      
      
        Common Options:
          -h, --help                       Get help on this command
          -V, --[no-]verbose               Set the verbose level of output
          -q, --quiet                      Silence commands
              --config-file FILE           Use this config file instead of default
              --backtrace                  Show stack backtrace on errors
              --debug                      Turn on Ruby debugging
      
      
        Arguments:
          packageversion  display the package version
          gemdir          display the path where gems are installed
          gempath         display path used to search for gems
          version         display the gem format version
          remotesources   display the remote gem servers
          platform        display the supported gem platforms
          <omitted>       display everything
      
        Summary:
          Display information about the RubyGems environment
      
        Description:
          The RubyGems environment can be controlled through command line arguments,
          gemrc files, environment variables and built-in defaults.
      
          Command line argument defaults and some RubyGems defaults can be set in a
          ~/.gemrc file for individual users and a /etc/gemrc for all users. These
          files are YAML files with the following YAML keys:
      
            :sources: A YAML array of remote gem repositories to install gems from
            :verbose: Verbosity of the gem command. false, true, and :really are the
                      levels
            :update_sources: Enable/disable automatic updating of repository metadata
            :backtrace: Print backtrace when RubyGems encounters an error
            :gempath: The paths in which to look for gems
            :disable_default_gem_server: Force specification of gem server host on
          push
            <gem_command>: A string containing arguments for the specified gem command
      
          Example:
      
            :verbose: false
            install: --no-wrappers
            update: --no-wrappers
            :disable_default_gem_server: true
      
          RubyGems' default local repository can be overridden with the GEM_PATH and
          GEM_HOME environment variables. GEM_HOME sets the default repository to
          install into. GEM_PATH allows multiple local repositories to be searched for
          gems.
      
          If you are behind a proxy server, RubyGems uses the HTTP_PROXY,
          HTTP_PROXY_USER and HTTP_PROXY_PASS environment variables to discover the
          proxy server.
      
          If you would like to push gems to a private gem server the RUBYGEMS_HOST
          environment variable can be set to the URI for that server.
      
          If you are packaging RubyGems all of RubyGems' defaults are in
          lib/rubygems/defaults.rb.  You may override these in
          lib/rubygems/defaults/operating_system.rb
      kirti@kirti-Aspire-5733Z:~$ 
      

      最后,为了向您展示您的要求,我会这样做:

      kirti@kirti-Aspire-5733Z:~$ gem environment gemdir
      /home/kirti/.rvm/gems/ruby-2.0.0-p0
      kirti@kirti-Aspire-5733Z:~$ gem environment gempath
      /home/kirti/.rvm/gems/ruby-2.0.0-p0:/home/kirti/.rvm/gems/ruby-2.0.0-p0@global
      kirti@kirti-Aspire-5733Z:~$ 
      

      【讨论】:

      • 谢谢!我不知道gem help commands。我应该写我正在使用 rbenv。
      【解决方案6】:

      您可以欺骗 gem open 显示 gem 路径:

      VISUAL=echo gem open gem-name
      

      例子:

      VISUAL=echo gem open rails
      => /usr/local/opt/asdf/installs/ruby/2.4.3/lib/ruby/gems/2.4.0/gems/rails-5.1.4
      

      它可以正常工作,不需要第三方 gem。

      【讨论】:

      • 这太完美了!遗憾的是,这些有用的信息是副作用而不是有意的命令。请注意,您还可以使用 -e 选项 (-e echo) 指定“编辑器”,如果它比设置环境变量更容易的话。
      • 漂亮!只需省略最后一部分并在编辑器中进入该目录并拆开宝石;-)
      【解决方案7】:

      gem envgem environment 一样工作。节省一些输入。

      # gem env
      RubyGems Environment:
        - RUBYGEMS VERSION: 2.0.14
        - RUBY VERSION: 2.0.0 (2014-02-24 patchlevel 451) [i686-linux]
        - INSTALLATION DIRECTORY: /usr/local/lib/ruby/gems/2.0.0
        - RUBY EXECUTABLE: /usr/local/bin/ruby
        - EXECUTABLE DIRECTORY: /usr/local/bin
        - RUBYGEMS PLATFORMS:
          - ruby
          - x86-linux
        - GEM PATHS:
           - /usr/local/lib/ruby/gems/2.0.0
           - /root/.gem/ruby/2.0.0
        - GEM CONFIGURATION:
           - :update_sources => true
           - :verbose => true
           - :backtrace => false
           - :bulk_threshold => 1000
        - REMOTE SOURCES:
           - https://rubygems.org/
      

      【讨论】:

      • 这不是“像工作一样”,它是相同的命令。 gem help commands 返回 "命令可以缩写,只要它们是明确的。例如,'gem i rake' 是 'gem install rake' 的缩写。" 换句话说,gem environment, @987654326 @ 和 gem e 都可以,但 gem environment 是为那些不知道它在做什么的人自我记录的,所以我们应该为初学者使用它。
      【解决方案8】:

      gem env 列出了 gems可以安装的位置,但这可以是 10 个或更多位置。如果你想知道特定 gem 在哪里安装,你可以执行:

      gem list -d <gemname>
      

      示例输出:

      tilt (2.0.9)
          Author: Ryan Tomayko
          Homepage: http://github.com/rtomayko/tilt/
          License: MIT
          Installed at: /opt/rubies/ruby-2.5.3/lib/ruby/gems/2.5.0
      
          Generic interface to multiple Ruby template engines
      

      【讨论】:

        【解决方案9】:

        如果你使用的是 rvm 工具,你可以运行这个命令来打印 gem 路径:

        rvm gemdir
        

        echo $GEM_HOME
        

        【讨论】:

          【解决方案10】:

          这很有效,并为您提供了每个 gem 的安装路径。这在尝试进行多阶段 docker 构建时非常有用。您可以在安装后的特定目录中复制。

          bash-4.4# gem list -d

          输出::

          aasm (5.0.6)
              Authors: Thorsten Boettger, Anil Maurya
              Homepage: https://github.com/aasm/aasm
              License: MIT
              Installed at: /usr/local/bundle
          
            State machine mixin for Ruby objects
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-26
            • 2011-03-28
            • 1970-01-01
            相关资源
            最近更新 更多