【问题标题】:How to tell which version of a gem a rails app is using如何判断 Rails 应用程序中使用的是哪个版本的 gem
【发布时间】:2009-10-25 17:00:37
【问题描述】:

我正在调查一个 rails 应用程序 - prod 服务器安装了特定 gem 的两个版本,我如何知道 prod 应用程序正在使用哪个版本?

【问题讨论】:

  • 你是在问哪个版本的 rails,或者哪个版本的其他 gem?
  • 特定 gem 的哪个版本。
  • 我在vendors/gems 下冻结了一个gem,然后在默认gems 位置安装了更新版本的gem。我正在从 Rails 中查找“我从这个位置加载了这个 gem”。

标签: ruby-on-rails rubygems


【解决方案1】:

在 Rails 3 和 Rails 4 中,使用 bundle show

在 Rails 2 中,rake gems 将打印出安装、冻结的 gem、依赖项和版本等。

【讨论】:

  • 只有在 environment.rb 文件中指定了 gem 时才有效。如果开发人员只是在某个地方需要它,那么 rake gems 将不起作用。
  • (或在 config/environments/* 文件之一中,取决于您的 RAILS_ENV。)
  • 如果你想过滤列表做bundle show | grep gem_name,例如指南针:bundle show | grep compass
  • 那么,当您输入 bundle show 并获得一堆版本包括“rails 2.3.17”的 Gems 并且您输入 rake gems 并获得看起来像传奇的东西时,这意味着什么(I=已安装等)但没有 gems/versions?我是否有 rails 版本 2?也许我有 rails 版本 2 和更高级的捆绑程序?这是好还是坏?(是的,我知道拥有这么旧的版本很糟糕轨道,我想知道有这样一个不匹配的(如果是的话)轨道和捆绑器是否是灾难性的)。
【解决方案2】:

如果你使用 bundler,那么你可以从

bundle show [gemname]

【讨论】:

  • 我来这个问题是因为我正试图将 移动到 bundler(可能还有很多人,因为 Heroku 现在需要这个)
  • 已弃用。请改用bundle info [gemname]
【解决方案3】:

我花了比预期更长的时间来查找和整理这些信息,因此我想将其发布在一个地方供其他人查看。我还想为 Rails 3 澄清一下:

  • script/about 已替换为 rake about 详细信息为 here。如果您对 Rails 3 的所有命令行更改列表感兴趣,可以在 here 找到它们。

  • rake gems 在 Rails 3 中不起作用。相反,您应该使用 bundle show

例如,您可以将所有版本的 gem 保存到一个文件中以供查看:

gem list > all_gems.txt

您可以查看您的 Rails 应用程序使用的版本:

bundle show > project_gems.txt

使用像 Vim 这样的编辑器,您可以轻松地使用 vimdiff 来查看更改

【讨论】:

    【解决方案4】:

    在终端中

      bundle show <gem-name>
      bundle show | grep <gem-name>
    

      gem list | grep <gem-name>
    

    例如:

      bundle show rails
      bundle show | grep rails
    
      gem list | grep rails
    

    【讨论】:

      【解决方案5】:

      可能有一种更直接的方法可以找到它,但如果您加载控制台并需要这样的特定版本:

      gem 'RedCloth', '3.0.4'
      

      它会告诉你已经激活了什么版本:

      => Gem::LoadError: can't activate RedCloth (= 3.0.4, runtime) for [], already activated RedCloth-4.2.2
      

      【讨论】:

        【解决方案6】:

        Gemfile.lock 中还有一个列表,位于您应用的根目录中。

        因此,我将Gemfile.lock 排除在我的.gitignore 之外。当我忘记在 GemFile 中指定 gem 版本时,这不止一次救了我,并且一个 gem 更新了重大更改。

        【讨论】:

          【解决方案7】:

          尝试使用script/about。您的config/environment.rb 也有相关信息。

          在您的config/environment.rb 中,您可以指定应用程序应使用特定gem 的哪个版本。但是,如果您的机器上安装了多个版本的 gem 并且您没有指定版本,则应用程序将使用该 gem 的最新版本。

          【讨论】:

            【解决方案8】:
            gem list <gemname>
            

            它将显示所有匹配的宝石,例如,如果有人这样做

            gem list rack
            

            那么输出将如下所示

            *** LOCAL GEMS ***
            
            rack (1.6.4)
            rack-mount (0.6.14)
            rack-test (0.6.3, 0.6.2, 0.5.7)
            

            【讨论】:

              【解决方案9】:

              script/about 会告诉您正在使用的核心 Rails 和 Rack gem 的版本,但不会告诉您其他任何东西。理想情况下,如果您查看config/environment.rb,应该有一个部分如下所示:

              # Specify gems that this application depends on and have them installed with rake gems:install
              # config.gem "bj"
              # config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
              # config.gem "sqlite3-ruby", :lib => "sqlite3"
              # config.gem "aws-s3", :lib => "aws/s3"
              

              如果运气好的话,应用程序的作者将在其中包含所有所需的 gem 和版本。但是,该文件中的版本是可选的,最终没有什么能阻止没有经验的开发人员在任何给定文件的顶部添加require 'rubygems'; require 'some_random_thing'

              如果您看到需要一个 gem,但没有指定版本,您可以键入 gem list 以查看系统上所有 gem 的所有版本。默认情况下,它将使用可用的最新版本。

              【讨论】:

              • 您的脚本/关于是否告诉您有关宝石的信息?我的只是告诉我我使用的是什么版本的 ruby​​、rails 和环境。
              • 对,Rails(和 Rack)都是 gem,script/about 会告诉你它们的版本以及核心 Rails 的东西(ActiveSupport 等),但它不会告诉你你关于任何其他宝石。抱歉,如果不清楚。
              【解决方案10】:
              bundle exec gem which gem_name
              

              大概是你可以用的:

              $› bundle exec gem which rails
              /Users/xxxx/.rvm/gems/ruby-2.1.2@gemset/gems/railties-4.1.7/lib/rails.rb
              

              【讨论】:

              • 我正在寻找有关在任意文件夹中执行的全局安装 gem 的哪个版本的信息,这使我找到了我认为正确的解决方案 - gem which gem_name
              【解决方案11】:

              捆绑显示宝石名称 即为了设计你必须像这样写

              bundle show devise
              

              它会打印出当前的 gem 版本。

              【讨论】:

                【解决方案12】:

                在较新的版本中,使用bundle show gem_name

                [DEPRECATED] use `bundle info gem_name` instead of `bundle show gem_name`
                

                【讨论】:

                  【解决方案13】:

                  如果你使用 bundler,那么你可以通过以下方式获取版本:

                  bundle info [gemname]
                  

                  【讨论】:

                    【解决方案14】:

                    为本地宝石试试这个:

                    gem list gemname | grep -P '(^|\s)\Kgemname(?=\s|$)'
                    

                    如果你使用捆绑包:

                    bundle exec gem list gemname | grep -P '(^|\s)\Kgemname(?=\s|$)'
                    

                    【讨论】:

                      【解决方案15】:

                      在 Gemfile 中,应该有答案:

                      gem 'rails', '4.0.0.rc1'
                      

                      【讨论】:

                      • Gemfile 并不总是明确声明版本号。
                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-01-20
                      • 2020-09-02
                      • 2020-05-24
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多